单元测试如何确认已引发异常

问题描述

| 我正在为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());
}
最好这样限制范围,就像将它应用于整个测试一样,即使错误的行引发了异常,该测试也可以通过。     ,
[ExpectedException(typeof(System.Exception))]
用于Visual Studio单元测试框架。 参见MSDN:   如果引发了预期的异常,则测试方法将通过。      如果抛出的异常继承自预期的异常,则测试将失败。     ,如果要遵循三重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\"));
}
    ,如果您使用的是Nunit,则可以使用
[ExpectedException( \"System.ArgumentException\" ) )]
    ,您可以使用Verify()方法进行单元测试,并比较返回类型中的异常消息。
InterfaceMockObject.Verify(i =>i.Method(It.IsAny<>())),\"Your received Exception Message\");
您需要在It.IsAny <>块中编写一些类名或数据类型     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...