测试中没有预期的异常


73

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

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

如果没有异常抛出,它将成功吗?


2
这真的是您要测试的吗?您确实意识到,如果testedFunction是no-op,它将通过测试。
Martijn 2012年

您的方法是否有不扔的特定要求?还是按照我的代码著作的精神完成它,因为它不会抛出?如果是后一个问题,那么您想检查 两个问题,为什么总的来说您不这样做。通过这种测试,您几乎不会获得任何收益。
公里

1
@jimmy_keen作为一个例外情况,曾经测试过第二次调用Dispose()不会抛出异常
Gareth 2014年

@Gareth:为什么它允许在第一次调用时抛出而不是在第二次调用时抛出?
公里

1
@jimmy_keen认为您误解了,它在第一次调用时不会抛出-测试是检查第二次调用是否也不会引起异常。“如果多次调用对象的Dispose方法,则该对象必须忽略第一个调用之后的所有调用。如果多次调用其Dispose方法,则该对象不得引发异常。” msdn.microsoft.com/zh-cn/图书馆/…
Gareth 2014年

Answers:


117
Assert.DoesNotThrow(() => { /* custom code block here*/});

或只是方法

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

有关更多详细信息,请参见NUnit异常声明。


33

使用NUnit 3.0约束模型类型断言,代码将如下所示:

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

此示例摘自NUnit Wiki


我得到的模棱两可的调用,我不确定如何解决。I我正在使用的版本是Unity 2018.4附带的版本,应该高于3.5。
jeromej


3

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

除非您指定

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

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

Assert.DoesNotThrow

断言


1

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


1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.