Test unitaire : isoler DateTime.Now
Lors des tests unitaires, il est souvent nécessaire de contrôler l'heure actuelle sans changer l'horloge du système. Cela crée des défis lorsque le code s'appuie sur DateTime.Now.
La meilleure approche consiste à créer une couche d'abstraction autour de DateTime.Now. L'injection de cette abstraction dans le code testé permet de simuler l'heure actuelle lors des tests unitaires.
Alternative : Contexte environnemental
<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>
Comment l'utiliser :
<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
Dans les tests unitaires :
<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>
Cependant, assurez-vous de nettoyer vos appareils de test en appelant TimeProvider.ResetToDefault() pour éviter d'interférer avec les tests suivants.
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!