Maison >développement back-end >C++ >Comment puis-je tester efficacement un code en fonction de DateTime.Now ?
Défis et stratégies pour les tests unitaires qui s'appuient sur DateTime.Now
Le code de test unitaire qui s'appuie sur l'heure actuelle est souvent délicat car la valeur de DateTime.Now change dynamiquement. Il n'est pas conseillé de modifier manuellement l'heure du système, une solution efficace est donc nécessaire.
La meilleure pratique consiste à isoler l'abstraction temporelle actuelle et à l'injecter dans le consommateur. De cette façon, le temps peut être manipulé dans les tests unitaires sans affecter le système sous-jacent.
Une autre approche consiste à définir une abstraction temporelle comme contexte environnemental. Cette approche implique la création d'une classe statique qui donne accès à l'heure actuelle et permet de la remplacer par un objet fictif lors des tests.
L'extrait de code suivant définit un TimeProvider comme contexte d'environnement :
<code class="language-csharp">public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return TimeProvider.current; } set { if (value == null) { throw new ArgumentNullException("value"); } TimeProvider.current = value; } } public abstract DateTime UtcNow { get; } public static void ResetToDefault() { TimeProvider.current = DefaultTimeProvider.Instance; } }</code>
TimeProvider est utilisé comme suit :
<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
Dans les tests unitaires, TimeProvider.Current peut être remplacé par un objet fictif :
<code class="language-csharp">var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
N'oubliez pas de réinitialiser le TimeProvider à son état par défaut après chaque test. Cela garantit que les tests unitaires ultérieurs ne sont pas affectés par l’abstraction temporelle modifiée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!