如何解决如何模拟单元测试中的时间传递?
我有一个方法在来自 ctor 的任务中以无限循环运行。该消息的作用相当于发送一个 ping
,并且在一定数量的 ping 失败时,阻止其他命令能够被发送。该方法从带有 Task.Factory.StartNew(()=>InitPingBackgroundTask(pingCts.token));
public async Task InitPingBackgroundTask (CancellationToken token)
{
while(!token.IsCancellationRequested)
{
try
{
Ping();
// handle logic
_pingsFailed = 0;
_canSend = true;
}
catch(TimeoutException)
{
// handle logic
if(++_pingsFailed >= settings.MaxPingLossNoConnection)
_canSend = false;
}
finally
{
await Task.Delay(settings.PingInterval);
}
}
}
public void DoCmd()
{
if(_canSend)
{
// handle logic
}
}
在我的测试中,使用 Moq,为了我的测试,我可以将设置设置为 PingInterval=TimeSpan.FromSeconds(1)
和 MaxPingLossNoConnection = 2
。
设置 sut
和其他所有内容后,我想调用 DoCmd()
并验证它实际上没有发送。 (我已经模拟了它的依赖关系,可以验证它的方法中的逻辑从未被调用过)
实现此目的的一种方法是在调用 sut.DoCmd()
之前在测试中添加睡眠或延迟,但这会使测试花费更长的时间。有没有办法模拟时间的流逝(例如角度中的 tick(desiredTime)
或类似的东西)?模拟时间的流逝而不必真正等待时间?
任何线索将不胜感激:-)
public void NotAllowSendIfTooManyPingsFailed()
{
var settings = new Settings()
{
PingInterval=TimeSpan.FromSeconds(1),MaxPingLossNoConnection = 0 // ended up changing to 0 to fail immidiately
}
// set up code,that Ping messages should fail
Thread.Sleep(100); // necessary to Ping has a chance to fail before method is called
sut.DoCmd();
// assert logic,verifying that DoCmd did not go through
}
理想情况下,我希望能够使用 MaxPingLossNoConnection
并将其设置为不同的数字以测试环境。这还需要添加睡眠来让时间过去。在这个测试中,我想完全删除 Sleep
,以及在睡眠会更长的其他类似测试中
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。