Muss ich in meinem Komponententest ein Wertobjekt fälschen?

8

Ich habe eine Klasse mit TDD geschrieben, die eine Methode (zu testende Methode) enthält, die ein einfaches Wertobjekt als Parameter verwendet ( range ).

Code:

Die zu testende Methode sieht so aus:

%Vor%

Außerdem habe ich einen Komponententest, um meine zu testende Methode zu überprüfen:

%Vor%

Frage:

Ich habe Roy Osheroves Buch über Unit Testing gelesen ("The Art of Unit Testing"). Da sagt er

  

"externe Abhängigkeiten (Dateisystem, Zeit, Speicher usw.) sollten sein   durch Stubs ersetzt "

Was meint er mit externer Abhängigkeit? Ist mein Wertobjekt (Bereich) auch eine externe Abhängigkeit, die gefälscht werden sollte? Sollte ich alle Abhängigkeiten einer Klasse vortäuschen?

Kann mir jemand einen Rat geben?

    
MUG4N 02.05.2013, 11:48
quelle

2 Antworten

4

TL; DR

Mache die einfachste Sache, die dein Problem löst.

Je länger ich TDD nutze, desto mehr schätze ich den Wert, pragmatisch zu sein. Das Schreiben von super-duper isolierten Unit Tests ist kein Wert für sich. Die Tests helfen Ihnen, qualitativ hochwertigen Code zu schreiben, der einfach zu verstehen ist und das richtige Problem löst.

Das Hinzufügen einer Schnittstelle für die Bereichsklasse ist eine gute Idee, wenn Sie zu einer anderen konkreten Bereichsimplementierung wechseln können, ohne den Code ändern zu müssen, der davon abhängt.

Wenn Sie diese Notwendigkeit nicht haben, dient das Hinzufügen einer Schnittstelle jedoch keinem wirklichen Zweck, aber es fügt etwas Komplexität hinzu, die Sie tatsächlich von dem Ziel des Schreibens von leicht verständlichem Code, der das Problem löst, weiterbringt.

Achten Sie darauf, nicht zu viel darüber nachzudenken, was sich in Zukunft ändern könnte. YAGNI ist ein guter Grundsatz, dem man folgen sollte. Wenn Sie TDD gemacht haben, werden Sie keine Probleme haben, den Code zu refactoring, wenn ein tatsächlicher Bedarf in der Zukunft auftritt, da Sie sich auf solide Tests verlassen müssen.

Im Allgemeinen würde ich ein geeignetes Value-Objekt nicht als Abhängigkeit betrachten. Wenn es komplex genug ist, dass Sie sich unbehaglich fühlen, anderen Code im Test verwenden zu lassen, klingt das eher nach einem Service.

    
Erik Öjebo 06.05.2013, 18:27
quelle
3

Ein Komponententest sollte isoliert (vollständig im Speicher) ausgeführt werden, ohne dass externe Systeme wie Dateisystem, Datenbank, Webdienst, Mail-Dienst, Systemuhr oder andere Elemente, die langsam oder schwer einzurichten sind, berührt werden müssen. oder unbestimmbar (wie die sich ständig ändernde Systemzeit).

Um dies tun zu können, sollten Sie diese externen Abhängigkeiten abstrahieren, die es Ihnen erlauben, sie in Ihren Tests zu verspotten.

Ein Unit-Test geht jedoch noch einen Schritt weiter. In einem Komponententest möchten Sie oft nur die Logik einer einzelnen Methode oder einer einzelnen Klasse testen. Sie sind nicht daran interessiert, die Integration mehrerer Komponenten zu überprüfen, sondern Sie möchten nur überprüfen, ob die Logik dieser einzelnen Klasse korrekt ist und ob sie mit anderen Komponenten korrekt kommuniziert.

Um dies tun zu können, müssen Sie diese anderen Komponenten fälschen (die Abhängigkeiten der Klasse). Im Allgemeinen sollten Sie also alle Abhängigkeiten (die Verhalten enthalten) einer Klasse vortäuschen.

    
Steven 02.05.2013 12:25
quelle