La mia preferenza è che le classi che utilizzano il tempo si basino effettivamente su un'interfaccia, come
interface IClock
{
DateTime Now { get; }
}
Con un'implementazione concreta
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Quindi, se lo desideri, puoi fornire qualsiasi altro tipo di orologio che desideri per il test, come
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Potrebbe esserci un sovraccarico nel fornire l'orologio alla classe che si basa su di esso, ma ciò potrebbe essere gestito da un numero qualsiasi di soluzioni di inserimento delle dipendenze (utilizzando un contenitore di inversione del controllo, una semplice vecchia iniezione di costruttore / setter o persino un modello di gateway statico ).
Funzionano anche altri meccanismi per fornire un oggetto o un metodo che fornisce i tempi desiderati, ma penso che la cosa fondamentale sia evitare di ripristinare l'orologio di sistema, poiché questo introdurrà dolore su altri livelli.
Inoltre, utilizzarlo DateTime.Now
e includerlo nei tuoi calcoli non solo non ti sembra giusto, ma ti priva della capacità di testare orari particolari, ad esempio se scopri un bug che si verifica solo vicino a un confine di mezzanotte o il martedì. L'utilizzo dell'ora corrente non ti consentirà di testare questi scenari. O almeno non quando vuoi.