C# 测试特定异常是否未发生';不可能发生在努尼特

C# 测试特定异常是否未发生';不可能发生在努尼特,c#,nunit,tdd,C#,Nunit,Tdd,首先,这非常类似于 我试图做的是运行一个测试,如果程序没有抛出特定异常,则该测试通过,但如果程序抛出了该特定异常,则我希望NUnit在测试运行程序中放置一条消息,解释此特定异常的可能原因 我正在这样做,我想,如果有人为第22卷输入一个值,会发生什么情况(假设在最后一帧中有一个备用卷,则最高卷数应为21卷) 我的解决方案使用了一个21整数的数组,我创建了一个输入22整数的测试 当我查看时,我看到此语法的选项: Assert.DoesNotThrow( TestDelegate code, stri

首先,这非常类似于

我试图做的是运行一个测试,如果程序没有抛出特定异常,则该测试通过,但如果程序抛出了该特定异常,则我希望NUnit在测试运行程序中放置一条消息,解释此特定异常的可能原因

我正在这样做,我想,如果有人为第22卷输入一个值,会发生什么情况(假设在最后一帧中有一个备用卷,则最高卷数应为21卷)

我的解决方案使用了一个21整数的数组,我创建了一个输入22整数的测试

当我查看时,我看到此语法的选项:

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的滚动):

目前,这是在测试运行程序中生成的消息: 消息:System.IndexOutOfRangeException:索引超出了数组的界限。

我希望此异常(并且仅此异常)的消息是什么 消息:System.IndexOutOfRangeException:一场游戏中的掷骰数不得超过21个。

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

如果您从未处理过一系列的bug(其中一个补丁暴露了代码中的旧漏洞,而该补丁暴露了另一个漏洞,并且该补丁再次暴露了第一个错误;重复),那么您算是幸运了

我认为,我看到的是一种针对特定不良条件的陷阱方法,如果它再次出现,我们可以迅速通知破坏方,他们的修复程序破坏了代码的原因。

如果我理解你的要求,那么你应该重新表述你对未来自我的看法

[Test]
public void ShouldIgnore22ndRoll() {    

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

}
[测试]
public void应忽略22ndroll(){
Assert.Throws(()=>rolllthesamennumber(1,22),“一场游戏中超过21个骰子应该失败。”);
}

除预期之外的任何其他异常都意味着代码的行为与预期不符。

您实际上是在一个测试中测试两个不同的场景,这是一个糟糕的测试设计,因为当它失败时,原子语句不足以描述它是哪种情况。想象一下测试一个包含5个苹果的碗。您做了一个测试st说你应该可以从碗里拿5个苹果,然后拿第6个,但忽略没有苹果的事实。有点奇怪。你应该把你的测试分为say
Test2ndRollPass()
Test22ndRollFail()
后者包含say a
Assert.Throws(…)
语句……此外,如果在代码内部的{1..21}滚动过程中由于某种未知原因抛出了一个不可见的
索引自动异常
,它现在将被忽略,因为您的测试假设错误来自
22次滚动
,这是
不正确的
(上面添加了其他信息)异常不是一个通过的条件,它应该仍然失败,我只想将测试运行程序中的消息从异常更改为异常,并加上一个原因。在这种情况下,必须有人稍后专门回来,并更改代码…只要所有输入都经过消毒,这样21个卷就不会发生,就不会有任何异常问题,但几年后,当我们有一个新的供应商没有清理他们的输入时,我们有一个需要调试的问题。我想留下一条消息,说,“你脱离了我们希望留在代码中的护栏”嗨,Nkosi,不,这是一个我正在添加的测试,然后我添加了代码来覆盖它,所以代码不会抛出异常,除非有人更改代码以移除防护栏。我不希望出现异常,但如果发生,那么我已经知道问题所在,我想告诉破坏代码的开发人员,他们的更改为什么会破坏代码.
public void AddPins(int pins)
{
    rolls[rollNumberDuringDataInput++] = pins;
}
[Test]
public void ShouldIgnore22ndRoll() {    

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

}