Моя перевага - мати класи, які використовують час, фактично покладаються на інтерфейс, наприклад
interface IClock
{
DateTime Now { get; }
}
З конкретною реалізацією
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Тоді, якщо ви хочете, ви можете надати будь-який інший годинник, який ви хочете для тестування, наприклад
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Можливо, у наданні годинника класу, який на нього покладається, можуть бути накладні витрати, але це може вирішуватися будь-якою кількістю рішень для введення залежностей (використовуючи контейнер Інверсія управління, звичайний старий конструктор / інжектор-інжектор або навіть статичну схему шлюзу ).
Інші механізми доставки об'єкта чи методу, які забезпечують бажаний час, також працюють, але я думаю, що головне - уникнути перезавантаження системного годинника, оскільки це просто призведе до болю на інших рівнях.
Крім того, використовувати DateTime.Now
та включати його у свої розрахунки не просто не вірно - це позбавляє вас можливості перевірити конкретний час, наприклад, якщо ви виявите помилку, яка трапляється лише біля півночі, або у вівторок. Використання поточного часу не дозволить протестувати ці сценарії. Або принаймні не коли завгодно.