Wie wird DateTime.Now in Unit-Tests simuliert? [geschlossen]

8

Die normale Lösung ist es hinter der Schnittstelle zu verstecken.

%Vor%

Im Komponententest können Sie ein Mock-Objekt verwenden und entscheiden, was zurückgegeben werden soll

%Vor%

Ich möchte keine andere Schnittstelle in meine Klasse injizieren, nur um die aktuelle Zeit zu bekommen. Es fühlt sich für ein so kleines Problem zu schwer an. Die Lösung besteht darin, eine statische Klasse mit einer öffentlichen Funktion zu verwenden.

%Vor%

Jetzt können wir die ISystemTime-Injektion entfernen und RecordService sieht so aus

%Vor%

Bei den Komponententests können wir die Systemzeit genauso leicht verspotten.

%Vor%

Natürlich gibt es einen Nachteil für all das. Sie verwenden öffentliche Felder (The HORROR!), So dass niemand Sie daran hindert, Code wie diesen zu schreiben.

%Vor%

Ich denke auch, es ist besser, Entwickler zu schulen, als Abstraktionen zu erstellen, nur um sie vor Fehlern zu schützen. Andere mögliche Probleme beziehen sich auf das Ausführen der Tests. Wenn Sie vergessen, die Funktion wieder in ihren ursprünglichen Zustand zu versetzen, kann dies Auswirkungen auf andere Tests haben. Dies hängt davon ab, wie der Unit Test Runner die Tests ausführt. Sie können die gleiche Logik verwenden, um Dateisystemoperationen nachzuahmen

%Vor%

Meiner Meinung nach ist das Implementieren dieser Art von Funktionalität (Zeitspotten, einfache Dateisystemoperationen) unter Verwendung öffentlicher Funktionen vollkommen akzeptabel. Es macht den Code einfacher zu lesen, verringert die Abhängigkeiten und es ist einfach, in den Komponententests zu spotten.

    
Unknown 30.03.2012, 11:35
quelle

3 Antworten

3

Sie müssen das nicht manuell implementieren. Sie können dazu Moles-Framework verwenden. channel 9

    
daryal 30.03.2012 11:37
quelle
3

Ich würde nicht sagen, dass die aktuelle Zeit eine so kleine Aufgabe war. Was ist, wenn Ihre Anwendung international wird und in mehreren Zeitzonen verwendet wird? In welcher Zeitzone erhalten Sie die aktuelle Zeit? Wahrscheinlich würden Sie eine gemeinsame Zeitzone wünschen verwenden, egal in welchem ​​Land?

Die Schnittstelle ermöglicht es Ihnen, dieses Wissen zu abstrahieren. Ich würde in Erwägung ziehen, die "aktuelle" Zeit als eine ziemlich komplizierte Aufgabe zu betrachten.

    
Lukazoid 30.03.2012 11:43
quelle
0

Wenn man bedenkt, dass wir über idiomatische c # sprechen, verstehe ich die Probleme mit der Zeremonie hinter der Schnittstelle nicht ganz. Im Wesentlichen haben Sie eine TimeProvider , die Sie in den Konstruktor als Abhängigkeit injizieren, und Sie stellen einen Stub zur Verfügung, um die Logik des relevanten zu testenden Codes zu steuern.

Ich glaube nicht, dass Ihre anderen Ansätze einen Nutzen bringen und sie haben den negativen Aspekt, dass sie nicht idiomatisch sind und die nützlichen Aspekte der Abhängigkeitsinjektion eliminieren (Abhängigkeiten dokumentieren, Spott machen, Kontrolle invertieren usw.) / p>     

Ritch Melton 30.03.2012 11:54
quelle

Tags und Links