C# 如何在 Assert.AreEqual 中期待异常?

标签 c# exception assert

示例:

Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");

我希望有一个异常(exception)。如何在 Assert.AreEqual 中期待异常?

谢谢。

最佳答案

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

Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10));

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

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

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

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

某些框架支持使用 [ExpectedException] 属性装饰方法 - 我建议反对使用它:

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

关于C# 如何在 Assert.AreEqual 中期待异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30327484/

相关文章:

c# - Int32.Parse() VS Convert.ToInt32()?

c# - MVC 3 Html.DisplayFor(...) 代码不生成 HTML 代码

iPhone - 线程 1 EXC_BAD_INSTRUCTION 错误,控制台中未打印任何内容

c - 子进程会在 abort() 上发送 SIGCHLD 吗?

c# - 在 c# 中从 vs2008 迁移到 vs2012 的 Crystal 报表上未找到文件异常未处理

C# 访问作为对象类型传递的列表元素

spring - 由于自定义异常类,避免通过 JVisualVM 进行 JMX 调用时出现 ClassNotFoundException

c# - 新的 ASP.NET Core MVC 项目抛出异常

java - Java org.junit.Assert线程安全吗?

python - 在cython中编译时如何删除python断言?