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

时间:2011-05-25 13:23:33

标签: c# .net unit-testing exception

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

5 个答案:

答案 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;中编写一些类名或数据类型块