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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:24:05