Ich habe ein PHPUnit-Scheinobjekt, das 'return value'
unabhängig von seinen Argumenten zurückgibt :
// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
->method('methodToMock')
->will($this->returnValue('return value'));
Ich möchte in der Lage sein, einen anderen Wert zurückzugeben, der auf den an die Mock-Methode übergebenen Argumenten basiert. Ich habe so etwas versucht wie:
$mock = $this->getMock('myObject', 'methodToMock');
// methodToMock('one')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('one'))
->will($this->returnValue('method called with argument "one"'));
// methodToMock('two')
$mock->expects($this->any))
->method('methodToMock')
->with($this->equalTo('two'))
->will($this->returnValue('method called with argument "two"'));
Dies führt jedoch dazu, dass sich PHPUnit beschwert, wenn der Mock nicht mit dem Argument aufgerufen wird. Daher gehe 'two'
ich davon aus, dass die Definition von methodToMock('two')
die Definition der ersten überschreibt.
Meine Frage lautet also: Gibt es eine Möglichkeit, ein PHPUnit-Scheinobjekt dazu zu bringen, basierend auf seinen Argumenten einen anderen Wert zurückzugeben? Und wenn ja, wie?
quelle
$this->returnCallback(array('MyClassTest','myCallback'))
.$this->returnCallback(function() { // ... })
Aus den neuesten phpUnit-Dokumenten: "Manchmal sollte eine Stubbed-Methode abhängig von einer vordefinierten Liste von Argumenten unterschiedliche Werte zurückgeben. Mit returnValueMap () können Sie eine Zuordnung erstellen, die Argumente mit entsprechenden Rückgabewerten verknüpft."
quelle
Ich hatte ein ähnliches Problem (obwohl etwas anders ... Ich brauchte keinen anderen Rückgabewert basierend auf Argumenten, sondern musste testen, um sicherzustellen, dass 2 Sätze von Argumenten an dieselbe Funktion übergeben wurden). Ich bin auf so etwas gestoßen:
Es ist nicht perfekt, da es erfordert , dass die Reihenfolge der zwei Anrufe zu foo () bekannt ist , aber in der Praxis ist dies wahrscheinlich nicht allzu schlecht.
quelle
Sie möchten wahrscheinlich einen Rückruf auf OOP-Weise durchführen:
quelle
Es ist nicht genau das, was Sie fragen, aber in einigen Fällen kann es helfen:
onConsecutiveCalls - Gibt eine Liste von Werten in der angegebenen Reihenfolge zurück
quelle
Übergeben Sie ein Array mit zwei Ebenen, wobei jedes Element ein Array von:
Beispiel:
quelle
Sie können das Argument auch wie folgt zurückgeben:
Wie Sie in der Mocking-Dokumentation sehen können , können Sie mit der Methode
returnValue($index)
das angegebene Argument zurückgeben.quelle
Meinst du so etwas?
quelle
Ich hatte ein ähnliches Problem, das ich auch nicht lösen konnte (es gibt überraschend wenig Informationen für PHPUnit). In meinem Fall habe ich gerade jeden Test separat durchgeführt - bekannte Eingabe und bekannte Ausgabe. Mir wurde klar, dass ich kein Allround-Scheinobjekt erstellen musste, sondern nur ein bestimmtes für einen bestimmten Test. Daher habe ich die Tests getrennt und kann einzelne Aspekte meines Codes als separate testen Einheit. Ich bin mir nicht sicher, ob dies auf Sie zutrifft oder nicht, aber das hängt davon ab, was Sie testen müssen.
quelle
quelle
Versuchen :
quelle