Mock eine Methode in derselben Klasse, die getestet wird
Lesezeit: 3 Minuten
James
Ich möchte eine Methode in derselben Klasse verspotten, die ich teste.
ClassA {
function hardToTest($arg) {
// difficult to test code
}
function underTest() {
return $this->hardToTest('foo');
}
}
Ich dachte, dass ich Reflexion dazu verwenden könnte, aber vielleicht ist es nur ein Zeichen, dass ich mich bewegen sollte hardToTest in ein anderes Objekt.
Ich verwende PhpUnit 5.7 und musste es verwenden createPartialMock und geben Sie an, welche Methoden gemockt werden müssen.
– Ryan
14. Juli 2017 um 18:11 Uhr
Ich stimme zu, dass es Codegeruch ist, eine Methode in derselben zu testenden Klasse zu verspotten, und dass die Methode in eine andere Klasse verschoben werden sollte.
– Leo Galleguillos
16. Januar 2018 um 22:16 Uhr
David Harkness
Dieser Test wird erfolgreich sein, wenn underTest() geht vorbei 'foo' zu hardToTest(). Dies ist als bekannt teilweise verspottet in der PHPUnit-Dokumentation, da Sie nur einige der Methoden verspotten.
Ich stimme Ihrem Instinkt zu, dass dieses Bedürfnis ein Codegeruch sein könnte, der Ihnen sagt, dass diese Klasse zu viel tut.
PHPUnit 5.4+
Seit getMock() war in 5.4 veraltet, verwenden getMockBuilder() stattdessen:.
$mock = $this->getMockBuilder('ClassA')
->setMethods(['hardToTest']) // onlyMethods in 8.4+
->getMock();
eigentlich sollte es sein $mock = $this->getMock('ClassA', [ 'hardToTest' ]); zweiter Parameter von getMock wird als Array von Methodennamen erwartet.
– Stefano Torresi
11. Juli 2014 um 9:38 Uhr
In einigen Fällen müssen Sie einen partiellen Mock durchführen, beispielsweise wenn eine der Klassenmethoden eine HTTP-Anforderung sendet. Es wäre gut, diese Methode zu verspotten und einen Stub für die Anfrage zurückzugeben.
Stimme dir zu, das ist ein Code-Geruch. Wann immer Sie eine Methode aus derselben Klasse verspotten müssen, ist es an der Zeit, darüber nachzudenken, sie in eine unabhängige Klasse zu verschieben. Es wird Ihre Tests viel einfacher machen. Ich habe das erlitten.
– tucq88
20. Juli 2017 um 10:37 Uhr
darfst du auch verwenden $this->getMockBuilder('ClassA')->setConstructorArgs([$arg1, $arg2])
– OzeanBT
21. August 2019 um 10:11 Uhr
Was ich zurückgegriffen habe, war das Erstellen einer Unterklasse meines zu testenden Systems mit der relevanten Methode, die ausgeblendet wurde.
teresko
Was genau ist der Grund, welche Methode schwer zu testen ist?
Wenn die Methode geschützt ist und Sie sie wirklich testen möchten, können Sie einfach Ihre ClassA erweitern und die erstellen hardToTest($arg) Öffentlichkeit.
Die Quintessenz ist, dass Sie die Klasse nicht ändern sollten, nur weil Sie unittest dafür schreiben müssen. Und überhaupt die private und protected Methoden sollten nicht getestet werden – Sie sollten nur die öffentliche Schnittstelle testen.
Ich muss eine Methode testen, die eine andere Methode in THE SAME CLASS aufruft. Ich möchte in der Lage sein, die Funktionalität für diese Methode zur Laufzeit zu simulieren. Das Verschieben der Methode in eine andere Klasse ist nicht meine bevorzugte Option.
– James
26. April 2011 um 20:00 Uhr
Ja, das kommt der Idee ziemlich nahe …. Erstellen Sie eine Unterklasse des zu testenden Systems und stub die relevanten Methoden aus, die ich nicht testen möchte. danke für die Hilfe
– James
26. April 2011 um 20:03 Uhr
PlusOne für die Erwähnung Das Endergebnis
– Phil
19. Oktober 2017 um 8:57 Uhr
„Das Fazit ist, dass Sie die Klasse nicht ändern sollten, nur weil Sie Unittests dafür schreiben müssen.“ Eine Klasse (oder Code), die nicht Unit-getestet werden kann, ist eine schlecht geschriebene Klasse (oder Code).
– Benutzer3790897
9. Januar 2018 um 10:45 Uhr
10543900cookie-checkMock eine Methode in derselben Klasse, die getestet wirdyes
Ich verwende PhpUnit 5.7 und musste es verwenden
createPartialMock
und geben Sie an, welche Methoden gemockt werden müssen.– Ryan
14. Juli 2017 um 18:11 Uhr
Ich stimme zu, dass es Codegeruch ist, eine Methode in derselben zu testenden Klasse zu verspotten, und dass die Methode in eine andere Klasse verschoben werden sollte.
– Leo Galleguillos
16. Januar 2018 um 22:16 Uhr