Хорошее решение - абстрагировать внешние зависимости, чтобы иметь возможность заглушить их во время теста. Для виртуализации времени я часто использую что-то вроде этого:
public interface ITimeService {
DateTime Now { get; }
void Sleep(TimeSpan timeSpan);
}
В вашем случае вам не нужна часть Sleep
, поскольку вы зависите только от текущего времени, и, конечно, вам нужно изменить свой код, чтобы использовать ITimeService
, предоставляемый извне, когда требуется текущее время.
Обычно вы используете эту реализацию:
public class TimeService : ITimeService {
public DateTime Now { get { return DateTime.Now; }
public void Sleep(TimeSpan timeSpan) { Thread.Sleep(timeSpan); }
}
Для целей тестирования вы можете использовать эту заглушку:
public class TimeServiceStub : ITimeService {
public TimeServiceStub(DateTime startTime) { Now = startTime; }
public DateTime Now { get; private set; }
public void Sleep(TimeSpan timeSpan) { Now += timeSpan; }
}