睡眠の量がテストで重要ではなく、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;
}
}
タイマーの起動など、より反応的な動作が必要な場合は、このアイデアを拡張する必要があります。