单元测试如何确认异常已被抛出

Ric*_*ard 11 .net c# unit-testing exception

我正在为ac#class编写单元测试,我的一个测试应该导致该方法在添加数据时抛出异常.我如何使用单元测试来确认抛出了异常?

Jon*_*eet 22

这取决于您使用的单元测试框架.在所有情况下,您可以执行以下操作:

[Test]
public void MakeItGoBang()
{
     Foo foo = new Foo();
     try
     {
         foo.Bang();
         Assert.Fail("Expected exception");
     }
     catch (BangException)
     { 
         // Expected
     }
}
Run Code Online (Sandbox Code Playgroud)

在某些框架中,您可以添加一个属性来测试方法以表示预期的异常,或者可能有一个方法,例如:

[Test]
public void MakeItGoBang()
{
     Foo foo = new Foo();
     Assert.Throws<BangException>(() => foo.Bang());
}
Run Code Online (Sandbox Code Playgroud)

像这样限制范围更好,就像你将它应用于整个测试一样,即使错误的行抛出异常,测试也可以通过.


aba*_*hev 11

[ExpectedException(typeof(System.Exception))]
Run Code Online (Sandbox Code Playgroud)

用于Visual Studio单元测试框架.

请参阅MSDN:

如果抛出预期的异常,测试方法将通过.

如果抛出的异常继承自预期的异常,则测试将失败.

  • 这有一个不幸的属性,如果在方法中的任何地方*抛出异常,它将通过 - 不仅仅是你期望它. (6认同)

Gra*_*ton 6

如果你想遵循 3A 模式(安排、行动、断言),你可以这样做,无论测试框架如何:

[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"));
}
Run Code Online (Sandbox Code Playgroud)