C# 测试没有预期的异常

C# 测试没有预期的异常,c#,.net,unit-testing,testing,nunit,C#,.net,Unit Testing,Testing,Nunit,我想创建NUnit测试,以确保我的函数不会引发异常。有什么具体的方法吗,还是我应该写下来 [Test] public void noExceptionTest() { testedFunction(); } 如果没有抛出异常,它将成功?是,没有抛出异常->测试通过。如果有一个不重投的试接球拦网,它也会通过 Assert.DoesNotThrow(() => { /* custom code block here*/}); 或者仅仅是方法 Assert.DoesNotThrow(()

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

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

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

是,没有抛出异常->测试通过。如果有一个不重投的试接球拦网,它也会通过

Assert.DoesNotThrow(() => { /* custom code block here*/});
或者仅仅是方法

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

有关详细信息,请参见“您是正确的”。如果出现异常,则测试将失败

除非你特别说明

[ExpectedException( typeof(YourException) ) ]
public void TestMethod()
{ 
   ...
}
或者正如@sll所说,您使用更具体的

Assert.DoesNotThrow

.

不引发异常是正常的操作过程。您的测试将成功验证未引发异常。

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

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

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

Assert.That(()=>SomeMethod(实际),抛出.Nothing)


此示例取自。

如果您想坚持使用Arrange-Act-Assert模式,可以事先定义TestDelegate,然后再断言它。函数仍在断言部分执行,但结构更清晰

// Arrange
var dataHandler = this.GetTestDataHandler();

// Act
TestDelegate transformAction = () => dataHandler.TransformData();

// Assert
Assert.DoesNotThrow(transformAction);

这真的是你想要测试的全部吗?您确实意识到,如果testedFunction是一个no op,它将通过测试。您的方法是否有不抛出的特殊要求?或者它是在我的代码工作的精神下完成的,因为它不会抛出错误?如果是后一个问题,你可能想检查一下为什么你一般不这么做。这样的测试几乎没有什么好处。@jimmy_keen作为一个例外情况,曾经测试过第二次调用Dispose()不会有什么好处throw@Gareth:为什么允许它在第一次召唤时抛出而不是在第二次召唤时抛出?@jimmy_keen认为你误解了,它不会在第一次调用期间抛出-测试是检查第二次调用是否也不会导致异常。“如果对象的Dispose方法被多次调用,则该对象必须忽略第一次调用之后的所有调用。如果多次调用其Dispose方法,则该对象不得引发异常。”我同意,但我认为使用Assert.DoesNotThrow可以清楚地表明,这是一个实际的测试,而不是一个仅用于执行代码的测试。我得到了不明确的调用,我不确定如何解决它。