Ma préférence est que les classes qui utilisent le temps reposent en fait sur une interface, telle que
interface IClock
{
DateTime Now { get; }
}
Avec une mise en œuvre concrète
class SystemClock: IClock
{
DateTime Now { get { return DateTime.Now; } }
}
Ensuite, si vous le souhaitez, vous pouvez fournir tout autre type d'horloge que vous souhaitez pour le test, tel que
class StaticClock: IClock
{
DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}
Il peut y avoir une surcharge à fournir l'horloge à la classe qui en dépend, mais cela pourrait être géré par n'importe quel nombre de solutions d'injection de dépendances (en utilisant un conteneur d'inversion de contrôle, une ancienne injection de constructeur / setter, ou même un modèle de passerelle statique ).
D'autres mécanismes de livraison d'un objet ou d'une méthode qui fournit les heures souhaitées fonctionnent également, mais je pense que l'essentiel est d'éviter de réinitialiser l'horloge système, car cela ne fera qu'introduire de la douleur à d'autres niveaux.
De plus, l'utiliser DateTime.Now
et l'inclure dans vos calculs ne vous semble pas juste - cela vous prive de la possibilité de tester des moments particuliers, par exemple si vous découvrez un bogue qui ne se produit que près d'une limite de minuit ou le mardi. L'utilisation de l'heure actuelle ne vous permettra pas de tester ces scénarios. Ou du moins pas quand vous le souhaitez.