Herausforderungen und Strategien für Unit-Tests, die auf DateTime.Now basieren
Unit-Testcode, der auf der aktuellen Zeit basiert, ist oft schwierig, da sich der Wert von DateTime.Now dynamisch ändert. Eine manuelle Änderung der Systemzeit ist nicht ratsam, daher bedarf es einer effizienten Lösung.
Die beste Vorgehensweise besteht darin, die aktuelle Zeitabstraktion zu isolieren und sie in den Verbraucher einzuspeisen. Auf diese Weise kann die Zeit in Unit-Tests manipuliert werden, ohne das zugrunde liegende System zu beeinträchtigen.
Ein anderer Ansatz besteht darin, eine Zeitabstraktion als Umgebungskontext zu definieren. Bei diesem Ansatz wird eine statische Klasse erstellt, die Zugriff auf die aktuelle Zeit bietet und es ermöglicht, diese während des Tests durch ein Scheinobjekt zu ersetzen.
Der folgende Codeausschnitt definiert einen TimeProvider als Umgebungskontext:
<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 wird wie folgt verwendet:
<code class="language-csharp">var now = TimeProvider.Current.UtcNow;</code>
In Unit-Tests kann TimeProvider.Current durch ein Scheinobjekt ersetzt werden:
<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>
Denken Sie immer daran, den TimeProvider nach jedem Test auf seinen Standardzustand zurückzusetzen. Dadurch wird sichergestellt, dass nachfolgende Unit-Tests nicht von der geänderten zeitlichen Abstraktion betroffen sind.
Das obige ist der detaillierte Inhalt vonWie kann ich Code abhängig von DateTime.Now effektiv testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!