Я предпочитаю, чтобы классы, использующие время, фактически зависели от интерфейса, такого как
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); } }
}
Могут быть некоторые издержки в предоставлении часов классу, который полагается на него, но это может быть обработано любым количеством решений для внедрения зависимостей (с использованием контейнера Inversion of Control, простого старого инжектора конструктора / установщика или даже Статический шлюз ).
Другие механизмы доставки объекта или метода, которые обеспечивают желаемое время, также работают, но я думаю, что ключевой момент состоит в том, чтобы избежать сброса системных часов, так как это только вызовет боль на других уровнях.
Кроме того, использование DateTime.Now
и включение его в ваши расчеты не просто кажется неправильным - это лишает вас возможности проверять определенное время, например, если вы обнаружите ошибку, которая происходит только около полуночной границы, или по вторникам. Использование текущего времени не позволит вам протестировать эти сценарии. Или, по крайней мере, не тогда, когда вы хотите.