Ich habe diese Methode, die vom aktuellen Datum abhängig ist. Es prüft, ob heute Sonntag, Montag, Dienstag oder Mittwoch ist, dann gibt es 5 Tage Vorlaufzeit für die Ankunft der versandten Artikel. Wenn es Thur, Fr oder Sa ist, gibt es 6 Tage Vorlaufzeit für das Wochenende.
%Vor%Die eigentliche Schätzlogik ist komplexer. Ich habe es für diese Frage vereinfacht. Meine Frage ist, wie schreibe ich einen Komponententest für etwas, das vom heutigen Datum abhängt?
Sie müssen das aktuelle Datum als Parameter übergeben:
%Vor%In echtem Code nennst du es so:
%Vor%Dann können Sie es wie folgt testen:
%Vor% Beachten Sie, dass dies auch einen möglichen Fehler in Ihrem Programm behebt, bei dem das Datum zwischen aufeinanderfolgenden Aufrufen von DateTime.Now
wechselt.
Im Allgemeinen möchten Sie die Methode zum Abrufen des aktuellen Datums und der Uhrzeit hinter einer Schnittstelle abstrahieren, z. B .:
%Vor%Der eigentliche Dienst wäre:
%Vor%Und ein Testservice wäre:
%Vor%Nehmen Sie für Dienste, die die aktuelle Uhrzeit benötigen, einen IDateTimeProvider als Abhängigkeit an. Übergeben Sie eine neue DateTimeProvider (); Wenn Sie eine Komponente sind, übergeben Sie einen neuen TestDateTimeProvider (timeToTestFor).
Ich gebe die kontroverse Antwort, teste es nicht.
Die Logik ist trivial und hat keine Abhängigkeiten, ich glaube an eine gute Codeabdeckung, aber nicht, wenn sie die Komplexität für keinen wirklichen Gewinn erhöht.
Ich würde vorschlagen, dies als Mark schlägt vor , aber mit dem Zusatz eines überladenen Aufrufs für die Produktionsnutzung, der keinen Parameter benötigt und DateTime.Now
verwendet %Vor%Ein "üblicher" Weg ist das "Fälschen" des aktuellen Systemdatums (was auf verschiedene Arten möglich ist) und dann den Code an "bekannten" Daten zu testen.
Ein weiterer interessanter Weg ist, Ihre Implementierung leicht zu ändern:
%Vor%Und dann verwende die Methode mit einem Parameter, um an "unmittelbaren" Daten zu testen.
Tags und Links c# unit-testing