Mock in PHPUnit - mehrere Konfiguration der gleichen Methode mit verschiedenen Argumenten
Ist es möglich zu konfigurieren, PHPUnit mock auf diese Weise?
$context = $this->getMockBuilder('Context')
->getMock();
$context->expects($this->any())
->method('offsetGet')
->with('Matcher')
->will($this->returnValue(new Matcher()));
$context->expects($this->any())
->method('offsetGet')
->with('Logger')
->will($this->returnValue(new Logger()));
Ich verwende PHPUnit 3.5.10 und es schlägt fehl, wenn ich bitten für Matcher, weil es erwartet, dass "Logger" - argument.
Es ist wie die zweite Erwartung ist das umschreiben der erste, aber wenn ich dump die mock, sieht alles ok.
InformationsquelleAutor der Frage Václav Novotný | 2011-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als von PHPUnit 3.6, es ist
$this->returnValueMap()
die kann verwendet werden, um wieder unterschiedliche Werte in Abhängigkeit der gegebenen Parameter an die Methode der stub.InformationsquelleAutor der Antwort leeb
Ist, ist dies leider nicht möglich mit dem Standard-PHPUnit-Mock-API.
Ich sehe zwei Optionen, die Sie erhalten können, in der Nähe so etwas wie dieses:
Mit -> ($x)
Dies funktioniert gut, aber Sie sind Tests mehr als Sie sollten (vor allem, dass es aufgerufen wird, mit matcher zuerst, und das ist ein Implementierungsdetail).
Auch dies wird fehlschlagen, wenn Sie mehr als ein Aufruf an jeden der die Funktionen!
Akzeptieren beide Parameter und die Verwendung returnCallBack
Dies ist mehr Arbeit, funktioniert aber schöner, da Sie nicht angewiesen auf die Reihenfolge der Aufrufe:
Beispiel:
Dieser Ausgabe:
Ich habe
$this->exactly(2)
im matcher, um zu zeigen, dass dies funktioniert mit dem zählen der Aufrufe. Wenn Sie nicht brauchen, tauschen Sie es aus für$this->any()
wird, natürlich, Arbeit.InformationsquelleAutor der Antwort edorian
Können Sie erreichen dies mit einem Rückruf:
Sollte pass für alle "Logger" oder "Matcher" - Argumente übergeben, um den Kontext Mock
offsetGet
Methode:Wie Sie sehen können, PHPUnit lief zwei tests. Eine für jedes dataProvider-Wert. Und in jedem dieser tests gemacht, die Behauptung für
with()
und das fürinstanceOf
daher vier Behauptungen.InformationsquelleAutor der Antwort Gordon
Anschluss an die Antwort von @edorian und die Kommentare (@MarijnHuizendveld) in Bezug auf die Gewährleistung, dass die Methode aufgerufen wird, mit beiden Matcher und Logger, und nicht einfach zweimal mit entweder Matcher oder-Logger, hier ist ein Beispiel.
Dies ist mit PHPUnit 3.7.
Wenn die Methode, die Sie testen nicht wirklich etwas zurückzugeben, und Sie müssen einfach testen, dass es heißt, mit den richtigen Argumenten, gilt der gleiche Ansatz. Für dieses Szenario habe ich auch versucht, tut dies mit einer callback-Funktion $this->callback als argument, eher als returnCallback in der wird. Dies scheitert, als intern phpunit ruft die callback - zweimal in den Prozess der überprüfung der argument-matcher Rückruf. Dies bedeutet, dass der Ansatz nicht wie auf dem zweiten Anruf, dieses argument hat sich bereits entfernt von der erwarteten arguments-array. Ich weiß nicht, warum phpunit nennt ihn zweimal (scheint eine unnötige Energieverschwendung), und ich denke, man könnte das umgehen, indem man nur das es auf den zweiten Anruf, aber ich war nicht selbstbewusst genug, dies ist beabsichtigt und konsistent phpunit Verhalten darauf zu verlassen, dass auftretende.
InformationsquelleAutor der Antwort crysallus
Ich stolperte auf dieser PHP-Erweiterung, um mock-Objekte: https://github.com/etsy/phpunit-extensions/wiki/Mock-Object
InformationsquelleAutor der Antwort powtac
Meine 2 Cent zu dem Thema: achten Sie bei der Verwendung an($x): dies bedeutet, dass die erwartete Methodenaufruf werden die ($x+1) - te Aufruf der Methode auf dem mock-Objekt; es bedeutet nicht, dass wird die ($x+1) - te Aufruf der Methode erwartet. Das machte mich Abfall einige Zeit, so dass ich hoffe, es wird nicht mit Ihnen. Herzliche Grüße an alle.
InformationsquelleAutor der Antwort Alessandro Ronchi
Hier sind auch einige Lösungen mit der doublit Bibliothek :
Lösung 1 : verwenden
Stubs::returnValueMap
Lösung 2 : die Verwendung einer callback -
InformationsquelleAutor der Antwort gealex