Ich entwerfe eine Klasse mit zwei Abhängigkeiten. Eine der Abhängigkeitsklassen wurde geschrieben und getestet. Der andere wurde noch nicht geschrieben.
Es ist mir eingefallen, weil die verbleibende Abhängigkeit geschrieben wird, um die Klasse, die es benutzen wird, zu erleichtern, dass ich die letztere zuerst schreiben soll, und die Schnittstelle der ersteren so gestalten soll, wie ich es verstehe.
Das scheint mir eine großartige Möglichkeit zu sein, Code zu schreiben. Immerhin, solange die Hauptklasse in ihrem Konstruktor einen Schein erhält, kann ich sie schreiben und testen, ohne dass mir bewusst ist, dass ihre Abhängigkeit nicht existiert, dann kann ich die Abhängigkeit erstellen, sobald ich sicher bin, dass ich weiß, was ich brauche .
Also: Wie mache ich das? Erstelle eine Skelettklasse, die ich modifiziere, während ich weitergehe. Vielleicht etwas wie:
%Vor%und dann spötteln Sie es mit PHPUnit, und Einrichten von Stubs, etc., um meine Klasse in der Entwicklung glücklich zu halten?
Ist das der richtige Weg?
Es scheint eine nette Art zu sein, Code zu entwickeln - und scheint mir mehr Sinn zu machen, als eine Abhängigkeit zu entwickeln, ohne wirklich genau zu wissen, wie sie benutzt wird.
Ja. Zumindest mache ich das gerade.
Wenn die erwarteten Mitarbeiter Ihrer Klasse zu dem Zeitpunkt, zu dem Sie sie in Ihren Tests für die Klasse, die Sie erstellen, benötigen, nicht vorhanden sind, haben Sie einige Optionen :
Wenn Sie gegen eine Schnittstelle programmieren , müssen Sie lediglich diese Schnittstelle erstellen und PHPUnit mitteilen, dass es eine Stub / Mock daraus erstellen soll
Wenn nicht existierende Klassen verspottet werden , bekommst du einige Nachteile, die ich nicht mag:
also würde ich dagegen raten.
Der Mittelweg wäre, einfach das leere Klassenskelett mit seiner Methode zu erstellen und diese für das Mocking zu verwenden.
Ich mag diesen Weg in Fällen, in denen es keine Schnittstelle gibt, auf die man hinweisen kann, weil es schnell ist und einen stabilen Testcode erzeugt.
Barebone-Klassen mit öffentlichen Apis zu haben, ist für mich keine Verletzung von TDD.
Datenübertragungsobjekte und Wertobjekte können immer mit dem new
in Ihrem Produktionscode erstellt werden, so dass Ihre Tests auch nur die echten Objekte
Es hilft, Ihre Tests ein wenig sauberer zu halten, da Sie nicht viele Getter / Setter-Methoden und vieles mehr erwarten müssen.
Wenn Sie eine testbasierte Entwicklungsmethodik verfolgen dann ist der übliche Ansatz wie folgt:
EDIT: Wie edorian sagte, sind PHP-Interfaces eine große Hilfe, da PHPUnit sowohl von Interfaces als auch von Klassen Mocks und Stubs generieren kann. Sie sind auch ein hervorragendes Werkzeug, um die Kopplung zu reduzieren und die Substituierbarkeit allgemein zu verbessern. Sie ermöglichen es Ihnen, jede Klasse zu ersetzen, die die erwartete Schnittstelle implementiert, und nicht nur Unterklassen der erwarteten Klasse.
Tags und Links php phpunit class-design