122 votes

Ce qui ' s un bon moyen pour écraser DateTime.Now pendant l’essai ?

J’ai un code (c#) qui dépend de la date du jour pour calculer correctement les choses à l’avenir. Si j’utilise la date du jour dans les essais, je dois répéter le calcul lors de l’essai, qui ne se sent pas bon. Quelle est la meilleure façon de définir la date sur une valeur connue dans le test afin que je peux tester que le résultat est une valeur connue ?

162voto

Blair Conrad Points 56195

Ma préférence est d'avoir des classes qui utilisent le temps de réellement s'appuyer sur une interface, tels 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 voulez pour les tests, tels que

class StaticClock: IClock
{
     DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}

Il peut y avoir des frais généraux dans la fourniture de l'horloge de la classe qui s'appuie sur elle, mais qui pourrait être prise en charge par un certain nombre de l'injection de dépendance des solutions (à l'aide d'une Inversion de Contrôle conteneur, plaine ancien constructeur/définition d'injection, ou même une Passerelle Statique Modèle).

D'autres mécanismes de la prestation d'un objet ou d'une méthode qui offre des moments voulus aussi travailler, mais je pense que la clé, c'est pour éviter la réinitialisation de l'horloge du système, qui va juste pour introduire de la douleur à d'autres niveaux.

Aussi, à l'aide de DateTime.Now et de l'inclure dans vos calculs, n'est pas seulement de ne pas se sentir le droit - il vous prive de la possibilité de tester des moments particuliers, par exemple si vous découvrez un bug qui n'arrive près de minuit limite, ou sur les les mardis. Utilisez l'heure actuelle ne vous permet pas de tester ces scénarios. Ou du moins, pas quand vous le voulez.

56voto

Anthony Mastrean Points 8582

Ayende Rahien utilise une méthode statique qui est assez simple...

21voto

mmilleruva Points 883

À l’aide de Microsoft Fakes pour créer une cale est un moyen très facile de le faire. Supposons que j’ai eu la classe suivante :

Dans Visual Studio 2012, vous pouvez ajouter un assembly de contrefaçons à votre projet de test en un clic droit sur l’assembly que vous souhaitez créer des Fakes/cales pour et en sélectionnant « Ajouter un Assembly Fakes »

Adding Fakes Assembly

Enfin, voici ce que la classe de test devrait ressembler :

17voto

Mendelt Points 21583

Je pense que la création d’une classe d’horloge séparée pour quelque chose de simple comme la date actuelle est un peu exagéré.

Vous pouvez aussi passer à la date du jour en tant que paramètre alors vous pouvez entrer une date différente dans le test. Cela a l’avantage de rendre votre code plus souple.

10voto

João Angelo Points 24422

Un autre à l’aide de Microsoft Moles (cadre d’isolement pour .NET).

Moles permet de remplacer n’importe quelle méthode .NET avec un délégué. Moles prend en charge les méthodes statiques ou non virtuelle. Grains de beauté s’appuie sur le profiler de Pex.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X