我应该将多个(不同的)输入值单元测试到一个函数吗?

时间:2013-11-28 21:20:56

标签: c# unit-testing

提供以下功能:

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

      return true; 
   }
}

如果input.State != State.PaidState,那么测试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>();
}

2 个答案:

答案 0 :(得分:1)

重要的是要考虑单元测试不能确保您的程序是正确的,而只是根据您的定义不会破坏它。

至于你的特定问题,如果你使用TDD进行三角测量,如果你偶然发现了一个不会强迫你编写任何新生产代码的新测试,那么我觉得额外的测试是没有用的从生产力的角度来看。

答案 1 :(得分: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>();
    }
}