我正在为一个C#类编写单元测试。我的其中一个测试应该在添加数据时导致该方法抛出异常。如何使用我的单元测试来确认是否已经抛出了异常?
我该怎么用我的单元测试来验证是否抛出了异常呢?我正在为一个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());
}
这样限制范围更好,如果您将其应用于整个测试,则即使错误行引发异常,测试也可能通过。
Assert.Throws
,因为它更加简洁。请注意,如果您需要检查异常的任何其他细节,可以在catch块中轻松完成。 - Jon SkeetAssert.Throws<>
也是微不足道的... - Ohad Schneider[ExpectedException(typeof(System.Exception))]
用于 Visual Studio 单元测试框架。
参见 MSDN:
如果抛出了预期的异常,则测试方法将通过。
如果抛出的异常继承自预期异常,则测试将失败。
[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"));
}
[ExpectedException( "System.ArgumentException" ) )]
typeof(...)
的方式。 - Jon SkeetInterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())), "Your received Exception Message");
你需要在 It.IsAny<> 块中写入一些类名或数据类型