Mi preferencia es que las clases que usen el tiempo realmente dependan de una interfaz, como
interface IClock
{
DateTime Now { get; }
}
Con una implementación concreta
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Luego, si lo desea, puede proporcionar cualquier otro tipo de reloj que desee para la prueba, como
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Puede haber algunos gastos generales al proporcionar el reloj a la clase que depende de él, pero eso podría ser manejado por cualquier cantidad de soluciones de inyección de dependencia (usando un contenedor de Inversión de Control, una inyección simple de constructor / configurador antiguo o incluso un Patrón de Puerta de Enlace Estático ).
Otros mecanismos de entrega de un objeto o método que proporciona los tiempos deseados también funcionan, pero creo que la clave es evitar reiniciar el reloj del sistema, ya que eso solo introducirá dolor en otros niveles.
Además, usarlo DateTime.Now
e incluirlo en sus cálculos no solo no se siente bien, sino que le priva de la capacidad de probar momentos particulares, por ejemplo, si descubre un error que solo ocurre cerca de un límite de medianoche o los martes. Usar la hora actual no le permitirá probar esos escenarios. O al menos no cuando quieras.