DateTime.Now
: Best PracticesUnit-Tests erfordern oft die Steuerung der Systemzeit, um verschiedene Szenarien zu simulieren. Eine direkte Änderung der Systemuhr ist unpraktisch und riskant. Die Lösung liegt in Abhängigkeitsinjektion und Abstraktion.
Der Schlüssel besteht darin, die Zeitquelle zu abstrahieren und in Ihren Code einzufügen. Dies ermöglicht ein einfaches Ersetzen des Echtzeitanbieters durch einen Mock während des Tests.
Lassen Sie uns eine Schnittstelle erstellen:
<code class="language-csharp">interface ITimeProvider { DateTime UtcNow { get; } }</code>
Diese Schnittstelle definiert einen Vertrag zum Erhalten der aktuellen UTC-Zeit. Wir implementieren es mit einer Standardklasse:
<code class="language-csharp">class DefaultTimeProvider : ITimeProvider { public DateTime UtcNow => DateTime.UtcNow; }</code>
Nun verwenden wir dies in einer abhängigen Klasse:
<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>
In Tests können Sie einen simulierten ITimeProvider
einfügen, der einen vorgegebenen DateTime
Wert zurückgibt und so eine vollständige Kontrolle über die Zeit innerhalb Ihrer Tests ermöglicht.
Alternativ kann ein Umgebungskontext verwendet werden:
<code class="language-csharp">public static class TimeContext { private static ITimeProvider _current = new DefaultTimeProvider(); public static ITimeProvider Current { get => _current; set => _current = value; } }</code>
Dies stellt einen weltweit zugänglichen Zeitanbieter bereit. In Ihren Tests können Sie TimeContext.Current
vorübergehend auf eine Simulation einstellen und daran denken, es nach jedem Test auf die Standardeinstellung zurückzusetzen, um Nebenwirkungen zu vermeiden.
Denken Sie daran: Bereinigen Sie Ihren Umgebungskontext nach jedem Test, um unbeabsichtigte Folgen bei nachfolgenden Tests oder der Anwendung selbst zu verhindern. Zu diesem Zweck wird dringend empfohlen, eine using
-Anweisung oder einen finally
-Block zu verwenden.
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!