Maison >développement back-end >C++ >Comment puis-je tester efficacement le code unitaire en fonction de « DateTime.Now » ?
DateTime.Now
: meilleures pratiquesLes tests unitaires nécessitent souvent de contrôler l'heure du système pour simuler divers scénarios. Modifier directement l’horloge du système est peu pratique et risqué. La solution réside dans l'injection de dépendances et l'abstraction.
La clé est d'abstraire la source temporelle et de l'injecter dans votre code. Cela permet de remplacer facilement le fournisseur en temps réel par une simulation pendant les tests.
Créons une interface :
<code class="language-csharp">interface ITimeProvider { DateTime UtcNow { get; } }</code>
Cette interface définit un contrat pour obtenir l'heure UTC actuelle. Nous allons l'implémenter avec une classe par défaut :
<code class="language-csharp">class DefaultTimeProvider : ITimeProvider { public DateTime UtcNow => DateTime.UtcNow; }</code>
Maintenant, utilisons ceci dans une classe dépendante :
<code class="language-csharp">class MyDependentClass { private readonly ITimeProvider _timeProvider; public MyDependentClass(ITimeProvider timeProvider) { _timeProvider = timeProvider; } public void MyMethod() { var currentTime = _timeProvider.UtcNow; // ... use currentTime ... } }</code>
Dans les tests, vous pouvez injecter une simulation ITimeProvider
renvoyant une DateTime
valeur prédéterminée, offrant un contrôle complet sur le temps au sein de vos tests.
Alternativement, un contexte ambiant peut être utilisé :
<code class="language-csharp">public static class TimeContext { private static ITimeProvider _current = new DefaultTimeProvider(); public static ITimeProvider Current { get => _current; set => _current = value; } }</code>
Cela fournit un fournisseur de temps accessible à l’échelle mondiale. Dans vos tests, vous pouvez temporairement définir TimeContext.Current
sur une simulation, et n'oubliez pas de le restaurer par défaut après chaque test pour éviter les effets secondaires.
Rappelez-vous : nettoyez votre contexte ambiant après chaque test pour éviter des conséquences inattendues lors des tests ultérieurs ou dans l'application elle-même. L'utilisation d'une instruction using
ou d'un bloc finally
est fortement recommandée à cet effet.
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!