最小起订量验证超时

Moq verify timeout

我有一些异步运行的生产代码(实际上是一个演员系统)。下面的测试检查在某个事件发生时是否正确调用了某个接口。目前显示:

var restarts = new Mock<ISystemCommandService>();
restarts.Setup(c => c.CommandType()).Returns("RestartCommand");
var subject = CreateSubject(restarts.Object);
subject.Tell(new Event ("TestEventName", "ValueChanged"));
Thread.Sleep(millisecondsTimeout: 300);
restarts.Verify(r => r.CommandAsync(It.Is<string>(s => 
    s.Contains(@"""RestartBackend"":true"))));

测试是绿色的,一切都很好,但我对 Thread.Sleep(300) 部分不满意。我无法删除它,因为演员系统需要一些时间来处理消息,但 300 毫秒取决于硬件。如果我可以删除 Sleep() 并写入

就好了
restarts.Verify(r => r.CommandAsync((It.Is<string>(s => 
        s.Contains(@"""RestartBackend"":true"))),
        TimeSpan.FromMilliseconds(500));

and Verify 在失败前最多等待 500 毫秒。或者有别的办法吗?

好的,答案是https://github.com/sekskant/AsyncVerifyForMoq。这包含 Mock 的扩展方法,它提供带超时的异步验证。我删除了 Sleep(),最后一行现在是:

await restarts.AsyncVerify(r => r.CommandAsync(It.Is<string>(s =>
    s.Contains(@"""RestartBackend"":true"))), 
    Times.Once(), 
    TimeSpan.FromSeconds(3));

它实际上比在我的开发机器上使用 Sleep() 慢 100 毫秒,但我不在乎,即使在最慢的硬件上也不会失败。谢谢!