如果您的睡眠时间对测试没有任何意义,并且您可以将 i 设置为 1 毫秒,那么在测试中只需睡眠 1 毫秒就可以了。
但是,如果您想通过超时和在特定时间点采取的特定操作来测试复杂的时序行为,那么将时间的概念抽象并将其作为依赖项注入会很快变得更容易。然后,您的测试可以在虚拟时间中运行并立即执行,即使代码运行时就像实时通过一样。
虚拟化时间的一种简单方法是使用如下内容:
interface ITimeService {
DateTime Now { get; }
void Sleep(TimeSpan delay);
}
class TimeService : ITimeService {
public DateTime Now { get { return DateTime.UtcNow; } }
public void Sleep(TimeSpan delay) { Thread.Sleep(delay); }
}
class TimeServiceStub : ITimeService {
DateTime now;
public TimeServiceStub() {
this.now = DateTime.UtcNow;
}
public DateTime Now { get { return this.now; } }
public void Sleep(TimeSpan delay) {
this.now += delay;
}
}
如果您需要更多反应性行为(例如计时器触发等),则必须扩展此想法。