PHP Überladen zu privaten Eigenschaften und Methoden des Einheitentests

8

Ich habe hier ein paar Fragen bezüglich der Verwendung von Komponententests gelesen, um private Methoden und Eigenschaften zu testen. Ich bin neu im Komponententest und möchte eine Eingabe zu der Methode machen, die ich versuche, damit meine Tests auf private / geschützte Eigenschaften und Methoden zugreifen können.

In dem Test, an dem ich gerade arbeitete, wollte ich bestätigen, dass die Übergabe eines bestimmten Parameters an das Objekt zu einer Eigenschaft führte. Ich verwende SimpleTest für meine Unit-Test-Ausbildung und meine Testmethode ist wie folgt:

%Vor%

Dann schrieb ich eine __get-Methode in CVObject wie folgt:

%Vor%

Meine Idee dabei ist, dass, wenn die aufrufende Datei von SimpleTest stammt, die Eigenschaft für die Testzwecke verfügbar gemacht wird, aber falls nicht, löst sie den Fehler aus. Dies erlaubt mir, das Eigentum privat zu halten, aber in der Lage zu sein, es im Testen zu verwenden, was mir mit einer bestimmten privaten Methode, die ich zu schreiben beginnen werde, wichtiger sein wird.

Also, meine Frage ist, vermisse ich hier etwas wirklich Schlechtes und sollte diese Technik vermeiden?

    
Chuck 19.02.2011, 09:50
quelle

3 Antworten

10

Wenn Sie festgefahren sind und einfach auf eine private / geschützte Eigenschaft zugreifen müssen, um gründliche Tests zu ermöglichen, sollten Sie zumindest den Code platzieren, der den Zugriff in Ihrem Test- oder Test-Framework ermöglicht. Das Einbetten von Nur-Test-Code in Produktionscode a) verkompliziert das Design, b) fügt mehr Code hinzu, der getestet werden muss, und c) bedeutet, dass der Code in der Produktion anders läuft.

Sie können Ken's Unterklasse-Methode für geschützte Eigenschaften verwenden, aber wenn Sie auf privat zugreifen müssen und auf PHP 5.3.2+ sind, können Sie Reflexion verwenden.

%Vor%

Beachten Sie, dass getPrivate() nicht so funktioniert, wie es für von Superklassen geerbte Eigenschaften geschrieben wurde, aber es ist nicht zu schwierig, die Hierarchie zu wiederholen, um die deklarierende Klasse zu finden.

    
David Harkness 20.02.2011, 00:28
quelle
1

Während Sie eine Komponente testen, müssen Sie nur ihre Schnittstelle testen (Eingabe, Ausgabe, Ausnahmen), ohne ihre interne Implementierung zu berücksichtigen oder sogar zu kennen (noch besser, wenn ein Programmierer Testfälle schreibt und der andere die Implementierung ausführt, siehe bitte) XP- und TDD-Techniken). Das einzige, was Sie testen müssen, sind öffentliche Methoden.

Um sicherzustellen, dass Ihre privaten (Hilfs-) Methoden korrekt geschrieben werden, verwenden Sie einfach den Code Coverage Analyzer (bitte überprüfen Sie Code Coverage Tools für PHP ) und decken so viel Code wie möglich mit Ihren Testfällen ab.

Ihre Lösung garantiert Ihnen einen Wartungsalarm. Testfälle und Komponentenimplementierung sollten in keiner Weise gekoppelt sein, da die Kopplung kugelsicher sein muss oder Sie sie sonst testen müssen.

    
ljank 19.02.2011 10:40
quelle
0

Eine schnelle und schmutzige Lösung besteht darin, geschützte (statt private) Methoden zu verwenden und dann einen Wrapper zu verwenden, der die zu testenden Methoden öffentlich macht.

%Vor%

Aber wie ljank darauf hinweist, kann das Testen privater Methoden / Implementierung zu einem Wartungsalbtraum werden - es bedeutet wahrscheinlich, dass Sie es tun Arbeit, die für andere Klassen genutzt werden sollte.

    
Ken 19.02.2011 14:04
quelle

Tags und Links