Mock eine Methode in derselben Klasse, die getestet wird

Lesezeit: 3 Minuten

Benutzer-Avatar
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

Benutzer-Avatar
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.

ClassATest {
    function testUnderTest() {
        $mock = $this->getMock('ClassA', ['hardToTest']);
        $mock->expects($this->once())
             ->method('hardToTest')
             ->with('foo');
        $mock->underTest();
    }
}

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+
             ->ge‌​tMock();

  • 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.

    – b01

    28. Juni 2016 um 16:00 Uhr

  • @julestruong $this->getMockBuilder(class)->setMethods(['methodName'])->getMock();

    – joar91

    16. März 2017 um 23:35 Uhr


  • 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.

Benutzer-Avatar
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

1054390cookie-checkMock eine Methode in derselben Klasse, die getestet wird

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy