【发布时间】:2011-05-25 13:23:33
【问题描述】:
我正在为一个 c# 类编写单元测试,我的一个测试应该会导致该方法在添加数据时引发异常。如何使用我的单元测试来确认异常已被抛出?
【问题讨论】:
-
什么单元测试框架?
-
Visual Studio 自带的标准单元测试系统,我不确定它有没有具体的名字
标签: c# .net unit-testing exception
我正在为一个 c# 类编写单元测试,我的一个测试应该会导致该方法在添加数据时引发异常。如何使用我的单元测试来确认异常已被抛出?
【问题讨论】:
标签: c# .net unit-testing exception
这取决于您使用的单元测试框架。在所有情况下,您可以执行以下操作:
[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());
}
这样限制范围会更好,就像将其应用于整个测试一样,即使 wrong 行抛出异常,测试也可以通过。
【讨论】:
Assert.Throws。请注意,如果您需要检查异常的任何其他详细信息,可以在 catch 块中轻松完成。
Assert.Throws<>也很简单……
[ExpectedException(typeof(System.Exception))]
用于 Visual Studio 单元测试框架。
见MSDN:
如果抛出预期的异常,测试方法将通过。
如果抛出的异常继承自预期的异常,则测试将失败。
【讨论】:
如果您想遵循 AAA 模式(安排、行动、断言),您可以这样做,而不管测试框架如何:
[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" ) )]
【讨论】:
typeof(...)
您可以使用 Verify() 方法进行单元测试,并根据返回类型比较您的异常消息。
InterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())), "Your received Exception Message");
您需要在 It.IsAny 块中编写一些类名或数据类型
【讨论】: