提供以下功能:
public class UnderTest
{
public bool Foo(Bar input)
{
if(input.State != State.Paid)
throw new Exception();
return true;
}
}
如果input.State != State.Paid
是State
,那么测试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 :(得分: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>();
}
}