You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NUnit与Moq编写的测试抛出异常却通过,原因何在?

为什么抛出NotImplementedException的异步测试在NUnit中通过了?

这是因为你在测试里调用异步方法时没有等待它完成,导致方法抛出的异常根本没被NUnit捕获到,测试就直接“顺利结束”了。

具体来说:

  • 你的SendAsync是返回Task的异步方法,当你直接调用它而不使用await关键字时,这个方法会在后台启动执行,但测试方法本身会立刻继续往下走(这里测试方法没有后续代码,直接结束)。NUnit看到测试方法正常执行完毕,就判定测试通过,完全没察觉到异步方法后续抛出的NotImplementedException。

要修复这个问题,只需要把测试方法改成异步的,并且等待SendAsync调用完成:

[Test]
public async Task SendAsync_WithSettings_ConnectsWithCredentials()
{
    // Act
    await _messageService.SendAsync(It.IsAny<Stream>(), It.IsAny<string>(), It.IsAny<Settings>());
}

这样修改后:

  1. 测试方法标记为async Task,NUnit会识别这是一个异步测试。
  2. await关键字会让测试方法等待SendAsync执行完成,此时方法里抛出的异常会被NUnit捕获,测试就会按照预期失败。

另外补充一点:如果你的异步方法返回Task<T>,测试方法也应该对应写成async Task<T>的形式,NUnit同样会正确处理任务的完成和异常捕获。

内容的提问来源于stack exchange,提问作者Willem de Jong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:22:33