我正在为c#类编写单元测试,我的一个测试应该导致该方法在添加数据时抛出异常。我如何使用单元测试来确认是否抛出了异常?
答案 0 :(得分:22)
这取决于您使用的单元测试框架。在所有案例中,您可以执行以下操作:
[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());
}
更好地限制这样的范围,就像你将它应用于整个测试一样,即使错误的行抛出异常,测试也可以通过。
答案 1 :(得分:11)
[ExpectedException(typeof(System.Exception))]
用于Visual Studio单元测试框架。
请参阅MSDN:
如果抛出预期的异常,测试方法将通过。
如果抛出的异常继承自预期的异常,则测试将失败。
答案 2 :(得分:4)
如果你想遵循三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"));
}
答案 3 :(得分:1)
如果您使用的是Nunit,则可以使用
标记测试[ExpectedException( "System.ArgumentException" ) )]
答案 4 :(得分:0)
您可以使用Verify()方法进行单元测试,并将您的异常消息与返回类型进行比较。
InterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())), "Your received Exception Message");
您需要在It.IsAny&lt;&gt;中编写一些类名或数据类型块