【发布时间】:2016-05-12 07:04:43
【问题描述】:
我试图模拟单元测试的复杂情况:
_mockController = new Mock<IController>();
_mockController.Setup(tc => tc.Interrupt(It.IsAny<Func<Task>>()))
.Callback<Func<Task>>(async f => await f.Invoke());
IController 有一个 void 方法 Interrupt(Func<Task>> f),它将一些工作排队等待完成。
我的测试对象确实调用了Interrupt(),我可以像这样验证调用:
_mockController.Verify(tc => tc.Interrupt(It.IsAny<Func<Task>>()), Times.Once);
...但是当在回调中调用参数Func<Task> 时,await 关键字在Task 中不受尊重:在Task 完成之前继续执行测试(尽管@987654331 @ 在回调中)。这种情况的一个症状是在 Interrupt() Task 参数中添加 await Task.Delay(1000) 会将通过的测试变成失败的测试。
这种行为是否是由于测试期间线程或Tasks 处理方式的细微差别?还是起订量的限制?我的测试方法有这个签名:
[Test]
public async Task Test_Name()
{
}
【问题讨论】:
-
我怀疑这是起订量的限制,但您必须向他们提出问题才能确定。
-
我用 Moq 打开了this issue。我会更新他们的回复。
-
我的解决方案是编写一个 IController 的存根实现,它基本上是一个自定义 Mock:它跟踪调用并在返回
Task的方法中异步运行这些中断,这是关键。
标签: c# unit-testing mocking async-await moq