小编jds*_*epp的帖子

对等待的模拟对象的异步回调

我试图模拟单元测试的复杂情况:

_mockController = new Mock<IController>();
_mockController.Setup(tc => tc.Interrupt(It.IsAny<Func<Task>>()))
    .Callback<Func<Task>>(async f => await f.Invoke());
Run Code Online (Sandbox Code Playgroud)

哪里IController有一个void方法Interrupt(Func<Task>> f),排队一些工作要做.

我测试的对象会调用Interrupt(),我可以像这样验证调用:

_mockController.Verify(tc => tc.Interrupt(It.IsAny<Func<Task>>()), Times.Once);
Run Code Online (Sandbox Code Playgroud)

...但是当Func<Task>在回调中调用参数时,await关键字在以下方面不受尊重Task:测试的执行在Task完成之前继续(尽管await在回调中).这种情况的一个症状是await Task.Delay(1000)Interrupt() Task参数中添加一个将通过的测试变成一个失败的测试.

这种行为是由于Task测试期间如何处理线程或s 的细微差别?或Moq的限制?我的测试方法有这个签名:

[Test]
public async Task Test_Name()
{
}
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq mocking async-await

6
推荐指数
1
解决办法
1409
查看次数

标签 统计

async-await ×1

c# ×1

mocking ×1

moq ×1

unit-testing ×1