首先,这与this question非常相似。
我要做的是运行一个测试,如果程序没有抛出特定异常,则该测试通过,但是如果程序发生该特定异常,我希望NUnit在测试运行器中显示一条消息,解释此特定异常的可能原因。
在这种情况下,我正在做the bowling score kata,我想如果有人输入第22卷的值会发生什么(假设最后一帧有备用,则最大卷数应为21)
我的解决方案使用21个整数的数组,并且我创建了一个输入22个整数的测试。
当我查看this page时,会看到该语法的选项:
Assert.DoesNotThrow( TestDelegate code, string message );
这是我认为该行应该是的样子,但是我知道(编译器在抱怨)使用typeof不会让我得到测试委托代码。
[Test]
public void ShouldIgnore22ndRoll()
{
Assert.DoesNotThrow(typeof(System.IndexOutOfRangeException), "There should never be more than 21 rolls in a game");
RollAllTheSameNumber(1, 22);
}
最重要的是,如果我看到此异常,我知道问题出在哪里,我想告诉我未来这个问题是什么(通过填充发送到testrunner的消息)。
任何其他例外,我都必须弄清楚,但这个例外是我已经考虑过的例外。
我怎么写这个断言?
编辑:
以下是变量定义:
int rollNumberDuringDataInput = 0;
const int AllowableNumberOfRolls = 21;
这是固定代码(静默忽略21号之后的任何掷骰):
public void AddPins(int pins)
{
if (rollNumberDuringDataInput < AllowableNumberOfRolls)
{
rolls[rollNumberDuringDataInput++] = pins;
}
}
以下是允许超过21卷的测试将导致测试失败的代码:
public void AddPins(int pins)
{
rolls[rollNumberDuringDataInput++] = pins;
}
当前,这是测试运行程序中生成的消息: 消息:System.IndexOutOfRangeException:索引超出数组的范围。
我希望此异常的消息是什么(仅此异常) 消息:System.IndexOutOfRangeException:游戏中的掷骰数不得超过21。
如果有人删除了防护逻辑,我希望测试运行程序中的消息告诉我为什么有该防护的业务逻辑。
如果您从未处理过一系列令人毛骨悚然的错误(其中一个修补程序暴露了代码中的旧漏洞,而该修补程序暴露了另一个漏洞,而该修补程序又暴露了第一个错误;请重复) )算上自己很幸运。
我认为,我认为这是一种用于捕获特定不良状况的方法,如果这种情况再次发生,我们可以迅速通知中断方,为什么他们的修复程序破坏了代码。
答案 0 :(得分:0)
根据您的描述
如果我了解您的要求,那么您应该重新表述您对自己未来的看法。
[Test]
public void ShouldIgnore22ndRoll() {
Assert.Throws<System.IndexOutOfRangeException>(() => RollAllTheSameNumber(1, 22), "More than 21 rolls in a game should fail.");
}
除预期之外的任何其他例外情况都意味着该代码的行为不符合预期。