使用Moq模拟返回的Task.Delay未被等待,调试时跳过等待逻辑
问题现象
执行await service.DoAsync(token)时,Moq模拟返回的延迟Task未被等待,调试时该代码直接“跳过”,未按预期进入长时间等待状态。
单元测试代码
[TestMethod] public async Task Do_Test() { var tokenSource = new CancellationTokenSource(); var serviceMock = new Mock<IService>(); serviceMock.Setup(_ => _.DoAsync(It.IsAny<CancellationToken>())) .Returns(Task.Delay(int.MaxValue, tokenSource.Token)); var prog = new MyProg(serviceMock.Object); await prog.RunAsync(...); ... // 断言逻辑 }
MyProg类代码
public class Myprog { public async Task RunAsync(CancellationToken token) { await service.DoAsync(token); ... } }
IService接口代码
public interface IService { Task DoAsync(CancellationToken token); }
问题原因
已定位代码中的bug:原本实例化对象时错误使用new MyProg(new Mock<IService>()),正确写法应为new MyProg(serviceMock.Object)。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

