PHPUnit - mehrere Stubs derselben Klasse

9

Ich baue Komponententests für die Klasse Foo , und ich bin ziemlich neu im Komponententest.

Eine Schlüsselkomponente meiner Klasse ist eine Instanz von BarCollection , die eine Anzahl von Bar -Objekten enthält. Eine Methode in Foo durchläuft die Auflistung und ruft ein paar Methoden für jedes Bar -Objekt in der Auflistung auf. Ich möchte Stub-Objekte verwenden, um eine Reihe von Antworten für meine Testklasse zu generieren. Wie kann ich die% stub-Klasse Bar verschiedene Werte zurückgeben, während ich es wiederhole? Ich versuche etwas in dieser Richtung zu tun:

%Vor%

So wird Foo->someMethod() Daten basierend auf den Ergebnissen erzeugen, die es von den Bar -Objekten erhält. Aber das gibt mir den folgenden Fehler, wenn das Array länger als eins ist:

%Vor%

Ein Gedanke, den ich hatte, war, ->will($this->returnCallback()) zu verwenden, um eine Callback-Methode aufzurufen, aber ich weiß nicht, wie ich dem Callback mitteilen soll, welches Bar -Objekt den Aufruf macht (und folglich welche Antwort) / p>

Eine andere Idee ist es, die onConsecutiveCalls() -Methode oder etwas ähnliches zu verwenden, um meinem Stub zu sagen, dass er beim ersten Mal, beim zweiten Mal usw. zurückkehrt, aber ich bin mir nicht sicher, wie ich das genau machen soll. Ich bin auch besorgt, dass, wenn meine Klasse jemals etwas anderes als eine geordnete Wiederholung der Sammlung tut, ich keine Möglichkeit haben werde, sie zu testen.

    
keithjgrant 22.03.2010, 22:32
quelle

3 Antworten

2

Ich bin mir leider nicht sicher, ob Sie Ihre eigentliche Frage mit getMock () lösen können, aber meine Erfahrung mit getMock () selbst ist gering.

Nur etwas, woran ich ohne weiteres denken kann, aber nicht Ihre Bar -Klasse kann das nicht helfen: Der dritte Parameter von getMock () lässt Sie Konstruktorargumente übergeben ( als ein Array).

Ich würde meine eigene Pseudo-Klasse erstellen, die Bar als Testhelfer erweitert (ein fantastischer Name für "nur eine andere Klasse, die nur in Tests verwendet wird"), die genau das macht, was ich mag und eine Reihe davon in Ihre einfügen Foo Objekt. Das gibt Ihnen die ganze Kontrolle, die Sie wollen, da Sie die fraglichen Methoden sofort ersetzen können, was getMock () nicht tut. Natürlich bedeutet das auch, dass Sie die Bar -Klasse in diesem Test nicht testen, was vielleicht nicht das ist, was Sie wollen - obwohl ich empfehlen würde, eine separate Testklasse für jede getestete Klasse zu schreiben, aber es gibt Fälle, in denen das unnötig puristisch ist.

%Vor%

Abgesehen davon bin ich ehrlich gesagt überrascht, dass Sie nur die Ausnahme sehen, die beschrieben wird, wenn Sie mehr als ein Array-Element haben. Ich habe beobachtet, dass PHPUnit tatsächlich erwartet, dass Sie jede Methode deklarieren, die es als getMock () -Parameter verfolgen soll, und andernfalls sturerweise Fehler ausgibt, da im Wesentlichen das, was es intern tut, erstellt wird eine eigene Erweiterung der Klasse, die jede Methode, die Sie ausdrücklich deklarieren, mit einer Logik umschließt, die bestimmen lässt, ob sie aufgerufen wurde (= Hinzufügen des Methodennamens zu einer logischen Liste).

Also färbt mich naiv (ernsthaft, ich bin wahrscheinlich, ich bin ein Testneuling, ich selbst), aber sehen Sie, ob Ihnen das hilft:

%Vor%     
pinkgothic 29.03.2010, 09:31
quelle
0

Dies sollte die Anforderung erfüllen, eine Reihe von Werten in der angegebenen Reihenfolge zurückzugeben, wenn Sie mit der Verwendung von global vertraut sind. Es hat keine Ahnung, welcher Balken aufgerufen wird, aber wenn jeder Balken einmal von Foo aufgerufen wird, sollte es nicht zu schwer sein, die Testdaten zu füllen.

%Vor%     
dtanders 25.03.2010 19:18
quelle
0

Ich habe bemerkt, dass Sie nach dem "- & gt; -Methode ('GetValue')" in Ihrem Code eine zusätzliche Klammer haben. Ich weiß nicht, ob du das kopiert oder eingefügt hast oder nicht.

    
Sean 26.03.2010 23:17
quelle