C#我怎么能在Assert.AreEqual中得到异常?

1 c# assert exception

例:

Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");
Run Code Online (Sandbox Code Playgroud)

我期待一个例外.我怎么能在Assert.AreEqual中得到异常?

谢谢.

Jon*_*eet 6

您不使用Assert.AreEqual,您使用Assert.Throws:

Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10));
Run Code Online (Sandbox Code Playgroud)

这将检查是否抛出了正确的异常.如果要添加更多断言,可以使用返回值:

var exception = Assert.Throws<ArgumentOutOfRangeException>(...);
Assert.AreEqual("Foo", exception.Message); // Or whatever
Run Code Online (Sandbox Code Playgroud)

这适用于至少NUnit和xUnit; 如果您使用的是不同的测试框架,则应该寻找类似的功能.如果它不存在,我建议你自己实现它 - 它很容易做到,并且比替代品(try/catch块或方法范围的ExpectedException属性)更清晰.或者,如果可以,改变单元测试框架......

我还强烈建议您开始遵循正常的.NET命名约定 - nDaysMonth不是一个好的方法名称...

一些框架支持使用[ExpectedException]属性来装饰方法- 我建议不要使用它:

  1. 这使得测试不清楚您期望抛出异常的位置.
  2. 如果在测试方法的其他地方抛出异常(即代码被破坏),测试仍将通过.
  3. 抛出异常后,您无法执行任何其他操作.
  4. 您无法检查有关异常的任何其他内容.

  • [`Assert`](https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assert.aspx)没有名为`Throws`的方法.或者我错过了什么? (2认同)
  • @oleksii:1)这使得测试不清楚你期望抛出异常的位置.2)如果在测试方法的其他地方抛出异常(即代码被破坏),测试仍然会通过.3)抛出异常后你不能做任何其他事情.4)您无法检查有关异常的任何其他内容.基本上,这是一个坏主意. (2认同)
  • @Jesús:你有没有读过为什么使用'ExpectedException`是个坏主意? (2认同)