Maison >développement back-end >C++ >Comment puis-je simuler efficacement DateTime.Now dans les tests unitaires ?
Tests unitaires : surmonter DateTime.Now dans les simulations
Les tests unitaires reposent souvent sur des horodatages spécifiques, mais modifier l'heure du système n'est peut-être pas idéal. Cet article explore des stratégies efficaces pour se moquer de DateTime.Now.
Abstraction et injection
L'approche préférée consiste à encapsuler l'heure actuelle dans une abstraction (par exemple TimeProvider) et à l'injecter dans le consommateur. Cela vous permet de remplacer un TimeProvider simulé pendant les tests tout en conservant l'implémentation d'origine pour une utilisation en production.
Contexte environnemental
Alternativement, vous pouvez définir une abstraction temporelle comme contexte d'environnement, ce qui vous permet de modifier l'heure actuelle sans modifier directement l'heure du système. Voici un exemple de mise en œuvre d'un contexte d'environnement :
<code>public abstract class TimeProvider { private static TimeProvider current = DefaultTimeProvider.Instance; public static TimeProvider Current { get { return current; } set { current = value; } } public abstract DateTime UtcNow { get; } }</code>
Dans ce contexte, TimeProvider.Current représente l'heure actuelle. Pour l'utiliser dans les tests, vous pouvez remplacer TimeProvider.Current par un objet fictif :
<code>using Moq; var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
Cela permet aux tests unitaires de définir des horodatages spécifiques sans affecter le code de production. Cependant, il est important de penser à réinitialiser le fournisseur de temps à son état par défaut après chaque test.
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!