So testen Sie die Logik, die vom aktuellen Datum abhängig ist

7

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?

    
Rohit Agarwal 17.02.2010, 20:49
quelle

8 Antworten

17

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.

    
Mark Byers 17.02.2010, 20:53
quelle
9

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).

    
Erik Forbes 17.02.2010 20:57
quelle
2

Lassen Sie Ihre Klasse einen IClock -Parameter (über Konstruktor oder Eigenschaft)

nehmen %Vor%

Sie können dann eine gefälschte Implementierung zum Testen verwenden

%Vor%

und eine echte Implementierung den Rest der Zeit.

%Vor%     
Ben Lings 17.02.2010 21:00
quelle
1

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.

    
Paul Creasey 17.02.2010 20:56
quelle
0

Scheint so, als ob es eine begrenzte Anzahl von Fällen gibt, die Sie jeweils explizit testen können. Die Methode hängt vom aktuellen Datum ab, aber die Ausgabe hängt nur vom Wochentag ab, und jedes Datum hat einen Wochentag.

    
John 17.02.2010 20:52
quelle
0

Sie könnten einen Delegaten übergeben, der DateTime.Now während der normalen Ausführung zurückgibt, und dann in Ihrem Test einen anderen Delegaten übergeben, der ein festes Datum zurückgibt, und Ihr Ergebnis basierend darauf bestätigen.

    
Luhmann 17.02.2010 20:53
quelle
0

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%     
C. Ross 17.02.2010 21:29
quelle
0

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.

    
Romain 17.02.2010 20:54
quelle

Tags und Links