测试NUnit中没有发生特定异常

时间:2019-06-30 06:07:13

标签: c# nunit tdd

首先,这与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。

如果有人删除了防护逻辑,我希望测试运行程序中的消息告诉我为什么有该防护的业务逻辑。

如果您从未处理过一系列令人毛骨悚然的错误(其中一个修补程序暴露了代码中的旧漏洞,而该修补程序暴露了另一个漏洞,而该修补程序又暴露了第一个错误;请重复) )算上自己很幸运。

我认为,我认为这是一种用于捕获特定不良状况的方法,如果这种情况再次发生,我们可以迅速通知中断方,为什么他们的修复程序破坏了代码。

1 个答案:

答案 0 :(得分:0)

根据您的描述

如果我了解您的要求,那么您应该重新表述您对自己未来的看法。

[Test]
public void ShouldIgnore22ndRoll() {    

     Assert.Throws<System.IndexOutOfRangeException>(() => RollAllTheSameNumber(1, 22), "More than 21 rolls in a game should fail.");

}

除预期之外的任何其他例外情况都意味着该代码的行为不符合预期。