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

已await所有异步调用仍无法命中async方法断点的问题排查

问题原因
  • 依赖注入不匹配
    你的MyClass中_orchestrator字段声明为具体实现类Orchestrator类型,而非你要注入的IOrchestrator接口类型,同时MyClass没有提供接收IOrchestrator参数的构造函数,测试中传入的Mock实例根本没有被MyClass使用,自然不会走你预期的Orchestrator逻辑。
  • Mock实例默认不执行真实实现代码
    你使用Moq创建的Mock<IOrchestrator>对象,默认调用方法时只会返回对应类型的默认值,不会执行真实Orchestrator类的代码,所以无法命中真实类的断点。如果你需要调试Orchestrator内部逻辑,不需要Mock该接口,直接实例化真实Orchestrator对象传入即可。
  • 额外语法问题:
    1. 测试类构造函数字段拼写错误:声明的字段是_orchestrator,赋值时写为orchestrator = new(),缺少下划线,无法编译通过
    2. Orchestrator的StartProcessAsync方法声明返回Task<Guid>,但计算出guid后未添加return guid;语句,编译报错
    3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:48:03