问题描述
|
我正在为c#类编写单元测试,我的测试之一应在添加数据时使方法引发异常。如何使用单元测试来确认已引发异常?
解决方法
这取决于您使用的单元测试框架。在所有情况下,您都可以执行以下操作:
[Test]
public void MakeItGoBang()
{
Foo foo = new Foo();
try
{
foo.Bang();
Assert.Fail(\"Expected exception\");
}
catch (BangException)
{
// Expected
}
}
在某些框架中,您可以将属性添加到测试方法中以表达预期的异常,或者可能存在一种方法,例如:
[Test]
public void MakeItGoBang()
{
Foo foo = new Foo();
Assert.Throws<BangException>(() => foo.Bang());
}
最好这样限制范围,就像将它应用于整个测试一样,即使错误的行引发了异常,该测试也可以通过。
,[ExpectedException(typeof(System.Exception))]
用于Visual Studio单元测试框架。
参见MSDN:
如果引发了预期的异常,则测试方法将通过。
如果抛出的异常继承自预期的异常,则测试将失败。
,如果要遵循三重A模式(安排,执行,声明),则可以使用此模式,而不考虑测试框架:
[Test]
public void MyMethod_DodgyStuffDone_ThrowsRulesException() {
// arrange
var myObject = CreateObject();
Exception caughtException = null;
// act
try {
myObject.DoDodgyStuff();
}
catch (Exception ex) {
caughtException = ex;
}
// assert
Assert.That(caughtException,Is.Not.Null);
Assert.That(caughtException,Is.TypeOf<RulesException>());
Assert.That(caughtException.Message,Is.EqualTo(\"My Error Message\"));
}
,如果您使用的是Nunit,则可以使用
[ExpectedException( \"System.ArgumentException\" ) )]
,您可以使用Verify()方法进行单元测试,并比较返回类型中的异常消息。
InterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())),\"Your received Exception Message\");
您需要在It.IsAny <>块中编写一些类名或数据类型