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

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

例:

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

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

谢谢。


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

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

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

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

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

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

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

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

  • 如果您使用的是Microsoft测试框架,则需要使用ExpectedExceptionAttribute修饰该方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [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