示例:
Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");
我期待一个例外。我怎么能在Assert.AreEqual中看到异常?
感谢。
答案 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 :(得分: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