2013-11-28 31 views
1

提供以下功能:我應該單元測試多個(不同)輸入值到一個函數嗎?

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

     return true; 
    } 
} 

請告訴我測試input.State != State.Paid最好的方式給出Stateenum?我想出了以下內容。但是,如果添加新的枚舉值,這不會被捕獲。有沒有更好的方法來測試這個或者我應該只關心單個測試?

[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'接口與'布爾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>(); 
    } 
} 
相關問題