Unit-Tests: DateTime.Now in Mocks überwinden
Unit-Tests basieren oft auf bestimmten Zeitstempeln, aber die Änderung der Systemzeit ist möglicherweise nicht ideal. In diesem Artikel werden effektive Strategien zum Spotten von DateTime.Now untersucht.
Abstraktion und Injektion
Der bevorzugte Ansatz besteht darin, die aktuelle Zeit in einer Abstraktion (z. B. TimeProvider) zu kapseln und in den Verbraucher einzuspeisen. Dadurch können Sie einen simulierten TimeProvider während des Testens ersetzen und gleichzeitig die ursprüngliche Implementierung für den Produktionseinsatz beibehalten.
Umweltkontext
Alternativ können Sie eine Zeitabstraktion als Umgebungskontext definieren, der es Ihnen ermöglicht, die aktuelle Zeit zu ändern, ohne die Systemzeit direkt zu ändern. Hier ist ein Beispiel für eine Umgebungskontextimplementierung:
<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>
In diesem Zusammenhang repräsentiert TimeProvider.Current die aktuelle Zeit. Um es in Tests zu verwenden, können Sie TimeProvider.Current durch ein Scheinobjekt ersetzen:
<code>using Moq; var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;</code>
Dadurch können Unit-Tests bestimmte Zeitstempel festlegen, ohne den Produktionscode zu beeinträchtigen. Es ist jedoch wichtig, daran zu denken, den Zeitgeber nach jedem Test auf seinen Standardzustand zurückzusetzen.
Das obige ist der detaillierte Inhalt vonWie kann ich DateTime.Now in Unit-Tests effektiv verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!