已await所有异步调用仍无法命中async方法断点的问题排查
问题原因
- 依赖注入不匹配
你的MyClass中_orchestrator字段声明为具体实现类Orchestrator类型,而非你要注入的IOrchestrator接口类型,同时MyClass没有提供接收IOrchestrator参数的构造函数,测试中传入的Mock实例根本没有被MyClass使用,自然不会走你预期的Orchestrator逻辑。 - Mock实例默认不执行真实实现代码
你使用Moq创建的Mock<IOrchestrator>对象,默认调用方法时只会返回对应类型的默认值,不会执行真实Orchestrator类的代码,所以无法命中真实类的断点。如果你需要调试Orchestrator内部逻辑,不需要Mock该接口,直接实例化真实Orchestrator对象传入即可。 - 额外语法问题:
- 测试类构造函数字段拼写错误:声明的字段是
_orchestrator,赋值时写为orchestrator = new(),缺少下划线,无法编译通过 Orchestrator的StartProcessAsync方法声明返回Task<Guid>,但计算出guid后未添加return guid;语句,编译报错MyClass的Start方法参数类型拼写错误,写为MyParametera,应为MyParameters
- 测试类构造函数字段拼写错误:声明的字段是
修复方案
1. 修复MyClass的依赖注入逻辑
public class MyClass : ControllerBase { // 改为接口类型 private readonly IOrchestrator _orchestrator; // 新增构造函数接收注入实例 public MyClass(IOrchestrator orchestrator) { _orchestrator = orchestrator; } [HttpPost] // 修正参数类型拼写 public async Task<IActionResult> Start([FromBody] MyParameters parameters) { var result = await _orchestrator.StartProcessAsync(parameters); return Accepted(result); } }
2. 修复Orchestrator的返回逻辑
public class Orchestrator : IOrchestrator{ public async Task<Guid> StartProcessAsync(MyParameters parameters) { var guid = await MyLogic(parameters, async () => { var manager = _SomeLogic.Get<SomeClass>(); await manager.StartAsync(parameters); }); // 新增返回语句 return guid; } }
3. 调整测试类使用真实Orchestrator实例(用于调试真实逻辑)
public class ControllerTests { private readonly MyClass aux; public ControllerTests() { // 直接实例化真实Orchestrator,不需要Mock var realOrchestrator = new Orchestrator(); aux = new MyClass(realOrchestrator); } [Fact] public async Task MyTest() { var result = await aux.Start(new MyParameters()); result.Should().BeOfType<AcceptedResult>(); } }
如果你需要保留Mock同时调用真实实现,可在创建Mock时设置CallBase = true:new Mock<IOrchestrator> { CallBase = true },但这种场景更推荐直接使用真实实例做集成测试。
内容的提问来源于stack exchange,提问作者Tarta
相关产品推荐
相关产品推荐

