Wolę mieć klasy, które wykorzystują czas, w rzeczywistości opierają się na interfejsie, takim jak
interface IClock
{
DateTime Now { get; }
}
Z konkretną realizacją
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Następnie, jeśli chcesz, możesz dostarczyć do testowania dowolny inny rodzaj zegara, taki jak
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Dostarczanie zegara do klasy, która na nim polega, może wiązać się z pewnym narzutem, ale może to być obsługiwane przez dowolną liczbę rozwiązań iniekcji zależności (przy użyciu kontenera Inversion of Control, zwykłego wstrzyknięcia starego konstruktora / ustawiacza lub nawet statycznego wzorca bramy ).
Inne mechanizmy dostarczania obiektu lub metody, które zapewniają pożądane czasy, również działają, ale myślę, że kluczową rzeczą jest unikanie resetowania zegara systemowego, ponieważ spowoduje to tylko ból na innych poziomach.
Ponadto używanie go DateTime.Now
i uwzględnianie w obliczeniach nie tylko nie wydaje się właściwe - pozbawia Cię możliwości testowania określonych godzin, na przykład jeśli odkryjesz błąd, który występuje tylko w pobliżu granicy północy lub we wtorki. Korzystanie z bieżącego czasu nie pozwoli Ci przetestować tych scenariuszy. A przynajmniej nie kiedy chcesz.