Minha preferência é ter aulas que usam o tempo na verdade dependem de uma interface, como
interface IClock
{
DateTime Now { get; }
}
Com uma implementação concreta
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Então, se quiser, você pode fornecer qualquer outro tipo de relógio que deseja para teste, como
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Pode haver alguma sobrecarga em fornecer o relógio para a classe que depende dele, mas isso pode ser tratado por qualquer número de soluções de injeção de dependência (usando um contêiner de Inversão de Controle, injeção simples de construtor / setter ou até mesmo um Padrão de Gateway Estático )
Outros mecanismos de entrega de um objeto ou método que fornece os tempos desejados também funcionam, mas acho que o principal é evitar redefinir o relógio do sistema, já que isso apenas introduzirá dor em outros níveis.
Além disso, usá DateTime.Now
-lo e incluí-lo em seus cálculos não parece certo - ele rouba a capacidade de testar horários específicos, por exemplo, se você descobrir um bug que só acontece próximo ao limite da meia-noite ou às terças-feiras. Usar a hora atual não permitirá que você teste esses cenários. Ou pelo menos não quando quiser.