Zeitabhängigkeiten in Unit-Tests isolieren
Das Testen von Code, der auf DateTime.Now
angewiesen ist, stellt eine einzigartige Herausforderung dar. Direktes Testen gegen die Systemuhr führt zu Instabilität und macht Tests weniger zuverlässig. Hier sind zwei effektive Ansätze, um diese Abhängigkeit zu verwalten:
Ansatz 1: Abhängigkeitsinjektion
Die bevorzugte Methode besteht darin, die Zeitabhängigkeit zu abstrahieren. Erstellen Sie eine Schnittstelle (z. B. ITimeProvider
), die eine Methode zum Abrufen der aktuellen Uhrzeit definiert. Implementieren Sie diese Schnittstelle mit einer konkreten Klasse (z. B. SystemTimeProvider
), die DateTime.Now
verwendet. Integrieren Sie diese Schnittstelle in Ihre Klassen, die die aktuelle Zeit benötigen.
Während des Unit-Tests können Sie einen Schein ITimeProvider
einfügen, der einen vorgegebenen DateTime
-Wert zurückgibt. Dadurch haben Sie die vollständige Kontrolle über die in Ihren Tests verwendete Zeit, ohne die Systemuhr zu beeinflussen.
Ansatz 2: Umgebungskontext (mit Vorsicht)
Eine weitere Option ist die Verwendung eines statischen Kontexts. Erstellen Sie eine Basisklasse (z. B. TimeProvider
) mit einer statischen Current
-Eigenschaft, die den aktiven Zeitanbieter enthält. Eine Standardimplementierung (z. B. SystemTimeProvider
) kann zunächst festgelegt werden.
Überschreiben Sie zum Testen die statische Current
-Eigenschaft, um einen Scheinanbieter zu verwenden. Entscheidend: Denken Sie daran, die Current
-Eigenschaft nach jedem Test auf den Standardwert zurückzusetzen, um unerwartetes Verhalten in nachfolgenden Tests zu verhindern. Dieser Ansatz erfordert eine sorgfältige Bereinigung, um Teststörungen zu vermeiden.
Zusammenfassung
Beide Methoden ermöglichen eine effektive Isolierung von Zeitabhängigkeiten in Ihren Unit-Tests. Allerdings wird die Abhängigkeitsinjektion im Allgemeinen aufgrund ihres übersichtlicheren Designs und des geringeren Risikos unbeabsichtigter Nebenwirkungen im Vergleich zur Verwendung eines statischen Umgebungskontexts bevorzugt.
Das obige ist der detaillierte Inhalt vonWie kann man Code abhängig von „DateTime.Now' effektiv testen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!