【问题标题】:Test with NO expected exception测试没有预期的异常
【发布时间】:2012-04-05 22:13:07
【问题描述】:

我想创建 NUnit 测试以确保我的函数不会引发异常。有什么具体的方法吗,或者我应该写

[Test]
public void noExceptionTest() {
  testedFunction();
}

如果不抛出异常就成功了?

【问题讨论】:

  • 这真的是您想要测试的全部内容吗?您确实意识到,如果testedFunction 是空操作,它将通过测试。
  • 你的方法有特殊要求不抛出吗?还是本着我的代码可以工作,因为它不会抛出的精神?如果是后者,您可能想检查thosetwo 问题,为什么您通常不这样做。你从这样的测试中收获很少甚至一无所获。
  • @jimmy_keen 作为一个例外情况,曾经测试过第二次调用 Dispose() 不会抛出
  • @Gareth:为什么允许在第一次调用而不是在第二次调用时抛出?
  • @jimmy_keen 认为您误解了,它不会在第一次调用期间抛出 - 测试是检查第二次调用是否也不会导致异常。 “如果多次调用对象的 Dispose 方法,则该对象必须忽略第一次之后的所有调用。如果多次调用其 Dispose 方法,则该对象不得抛出异常。” msdn.microsoft.com/en-us/library/…

标签: c# .net unit-testing testing nunit


【解决方案1】:

是的,没有抛出异常 -> 测试通过。如果有 try-catch 块而没有重新抛出,它也会通过。

【讨论】:

    【解决方案2】:
    Assert.DoesNotThrow(() => { /* custom code block here*/});
    

    或者只是方法

    Assert.DoesNotThrow(() => CallMymethod());
    

    更多详情见NUnit Exception Asserts

    【讨论】:

      【解决方案3】:

      你是对的。如果有异常,则测试将失败。

      除非你指定

      [ExpectedException( typeof(YourException) ) ]
      public void TestMethod()
      { 
         ...
      }
      

      或者正如@sll 所说,您使用更具体的

      Assert.DoesNotThrow
      

      assertion.

      【讨论】:

        【解决方案4】:

        不抛出异常是正常的做法。您的测试将成功验证未引发异常。

        【讨论】:

        • 我同意,但我认为使用 Assert.DoesNotThrow 可以清楚地表明它是一个实际测试与一个仅用于执行代码的测试。
        【解决方案5】:

        我认为存在与单元测试逻辑相关的问题。 如果您期望在某些输入下出现特定异常,则将其声明为预期异常。如果您只是检查您的函数是否正常运行,并且在此正常运行期间没有预期异常,您只需编写它,如果它抛出任何异常,您的测试就会失败。

        另一方面,您的代码似乎工作正常,只检查没有异常可能不是单元测试的正确方法。在单元测试中,通常你期望一些输出(期望值),你有一些实际输出(实际值)并且你断言期望值和实际值是相同的。

        【讨论】:

          【解决方案6】:

          使用 NUnit 3.0 Constraint Model 类型断言,代码如下所示:

          Assert.That(() => SomeMethod(actual), Throws.Nothing);

          这个例子取自NUnit wiki

          【讨论】:

          • 我得到了模棱两可的调用,我不确定如何解决它。 ? 我使用的版本是 Unity 2018.4 附带的版本,应该在 3.5 以上。
          【解决方案7】:

          如果你想坚持 Arrange-Act-Assert 模式,你可以预先定义 TestDelegate 并在以后断言它。函数还是在 Assert 部分执行,但结构更清晰。

          // Arrange
          var dataHandler = this.GetTestDataHandler();
          
          // Act
          TestDelegate transformAction = () => dataHandler.TransformData();
          
          // Assert
          Assert.DoesNotThrow(transformAction);
          

          【讨论】:

            猜你喜欢
            • 2019-01-23
            • 2015-08-09
            • 2011-07-31
            • 2013-10-08
            • 1970-01-01
            • 1970-01-01
            • 2015-07-31
            • 2016-01-18
            • 1970-01-01
            相关资源
            最近更新 更多