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

C# How I can expect a exception in Assert.AreEqual?

示例:

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

我希望有例外。我如何期待 Assert.AreEqual?

中的异常

谢谢。

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

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

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

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

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

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

一些框架支持用 [ExpectedException] 属性装饰方法 - 我建议 against 使用那个:

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

如果您使用的是 Microsoft 测试框架,则需要使用 ExpectedExceptionAttribute:

修饰方法
[TestClass]
public class UnitTest1
{
    [TestMethod]
    [ExpectedException(typeof(ArgumentOutOfRangeException))]
    public void TestMethod1()
    {
        //Do whatever causes the exception here
    }
}

然后测试将通过或失败取决于是否抛出异常。

但是,正如 Jon 在下面指出的那样,请找到支持 Assert.Throws 或其某些变体的测试框架。根据您正在做的事情,用预期的异常装饰可能会导致错误通过或代码中的其他问题,并且在方法中抛出异常后很难做任何事情。使用功能齐全的框架将显着提高测试质量。

我推荐 NUnit,http://www.nunit.org/

或者还有其他类似 XUnit https://github.com/xunit/xunit

或其他几十个:http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#.NET_programming_languages