2013-11-28 4 views
1

Дайте следующую функцию:Должен ли я тестировать несколько (разных) входных значений функции?

public class UnderTest 
{ 
    public bool Foo(Bar input) 
    { 
     if(input.State != State.Paid) 
     throw new Exception(); 

     return true; 
    } 
} 

Что лучший способ проверить input.State != State.Paid, учитывая, что State является enum? Я придумал следующее. Однако это не будет ловить, если добавлено новое значение enum. Есть ли лучший способ проверить это или я должен только заботиться об одном тесте?

[Theory] 
[InlineData(State.New)] 
[InlineData(State.Cancelled)] 
[InlineData(State.Complete)] 
public void NotPaidBar_ThrowsException(State state) 
{ 
    // Arrange 
    var bar = new Bar() 
    { 
     State = state 
    }; 

    var underTest = new UnderTest(); 

    // Act 
    Action result =() => underTest.Foo(bar); 

    // Assert 
    result 
     .ShouldThrow<Exception>(); 
} 
+0

Вы можете создать 'интерфейс IState' с' BOOL UnderTest () 'определение метода. Таким образом, все реализации состояния должны будут реализовать «UnderTest». – Oliver

ответ

1

Важно учитывать, что модульные тесты не гарантируют правильность вашей программы, но только то, что она не нарушена в соответствии с вашими определениями.

Что касается вашего конкретного вопроса, если вы используете TDD с триангуляцией, и если вы наткнетесь на новый тест, который не заставит вас писать какой-либо новый производственный код, то я бы чувствовал, что дополнительный тест не является полезно с точки зрения производительности.

0

Вы можете проверить все состояния с помощью простого цикла, если вы хотите, даже те, которые будут добавлены позже перечисления:

public void NotPaidBar_ThrowsException() 
{ 
    var allStates = Enum.GetValues(typeof (State)).Cast<State>(); 

    foreach (var state in allStates.Except(new[]{State.Paid})) 
    { 
     // Arrange 
     var bar = new Bar() 
     { 
      State = state 
     }; 

     var underTest = new UnderTest(); 

     // Act 
     Action result =() => underTest.Foo(bar); 

     // Assert 
     result.ShouldThrow<Exception>(); 
    } 
} 
Смежные вопросы