C#中针对TryAsync的负向测试运行失败,是什么原因?
问题原因分析
- 你对TryAsync的认知大部分是正确的,LanguageExt的
TryAsync<T>类型确实会自动捕获异步执行过程中抛出的异常并封装为Result<T>的故障状态,这次测试失败的核心问题出在Moq的配置方式,而非TryAsync本身不适用于测试场景。 - 你当前给
HttpMessageHandler配置的.Throws()是同步抛出异常:调用SendAsync方法时会直接在同步上下文抛出异常,还没等返回Task对象,这个异常没有进入TryAsync的异步异常捕获逻辑,因此直接冒泡到了测试层导致用例失败。
修复方案
只需要修改Moq的异常配置代码,将同步抛出改为异步抛出即可:
// 原错误写法 mockHttpMessageHandler.SetupAnyRequest() .Throws(new SalesforceCacheException(message)); // 替换为正确写法 mockHttpMessageHandler.SetupAnyRequest() .ThrowsAsync(new SalesforceCacheException(message));
.ThrowsAsync()会让SendAsync返回一个携带异常的已故障Task,这个异常会在await的时候触发,正好被TryAsync的内部逻辑捕获并封装到Result<bool>中,你的后续断言就可以正常执行。
额外验证点
如果修改后仍然有问题,可以检查下你项目中引用的LanguageExt版本,极少数旧版本的TryAsync确实存在同步异常未捕获的BUG,升级到最新稳定版即可解决。
内容的提问来源于stack exchange,提问作者Brian Kessler
相关产品推荐
相关产品推荐

