使用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>()); }
这样修改后:
- 测试方法标记为
async Task,NUnit会识别这是一个异步测试。 await关键字会让测试方法等待SendAsync执行完成,此时方法里抛出的异常会被NUnit捕获,测试就会按照预期失败。
另外补充一点:如果你的异步方法返回Task<T>,测试方法也应该对应写成async Task<T>的形式,NUnit同样会正确处理任务的完成和异常捕获。
内容的提问来源于stack exchange,提问作者Willem de Jong
相关产品推荐
相关产品推荐

