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

时间:2015-05-19 13:44:25

标签: c# exception assert

示例:

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

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

感谢。

2 个答案:

答案 0 :(得分:6)

您不能使用Assert.Throws,而是使用Assert.Throws<ArgumentOutOfRangeException>(() => Program.nDaysMonth(5, -10));

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

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

ExpectedException

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

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

某些框架支持使用[ExpectedException]属性修饰方法 - 我建议使用

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

答案 1 :(得分:0)

如果您使用的是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