Einführung
Das Verspotten privater Methoden kann eine nützliche Technik zum Testen der Logik innerhalb eines sein Klasse, ohne ihre Implementierungsdetails offenzulegen. Es ist jedoch wichtig, dies mit Vorsicht anzugehen, um eine Unterbrechung der Kapselung und eine Gefährdung der Integrität Ihres Codes zu vermeiden.
Problem
Betrachten Sie das folgende Beispiel:
<code class="php">class A { public function b() { // some code $this->c(); // some more code } private function c(){ // some code } }</code>
Wie können Sie das Ergebnis der privaten Methode c() stubbeln, um den „etwas mehr Code“-Teil der öffentlichen Funktion b() mit PHPUnit zu testen?
Lösung
Option 1: Refactoring in Betracht ziehen
Im Allgemeinen gilt es nicht als bewährte Methode, private Methoden direkt zu testen. Konzentrieren Sie sich stattdessen auf das Testen der öffentlichen API der Klasse. Alle internen Implementierungsdetails sollten als Blackbox betrachtet werden.
Option 2: Mocks verwenden (mit Vorsicht vorgehen)
In bestimmten Szenarien kann es jedoch zu Spott-Privatmethoden kommen notwendig. Um dies mit PHPUnit zu erreichen:
Erstellen Sie ein Scheinobjekt für die zu testende Klasse:
<code class="php">$mock = $this->getMockBuilder('A') ->disableOriginalConstructor() ->getMock();</code>
Definieren Sie das erwartete Verhalten des Private Methode:
<code class="php">$mock->expects($this->once()) ->method('c') ->will($this->returnValue(YOUR_STUBBED_VALUE));</code>
Ersetzen Sie die ursprüngliche Instanz durch das Mock in Ihrem Test:
<code class="php">$originalInstance = new A(); $this->reflection()->setProtectedProperty( $originalInstance, 'c', $mock );</code>
Fazit
Obwohl es verlockend sein mag, private Methoden zu Testzwecken zu verspotten, ist es wichtig, den Prinzipien der Kapselung Priorität einzuräumen und zu vermeiden, dass interne Details unnötig offengelegt werden. Erwägen Sie eine Umgestaltung Ihres Codes, um Tests zu ermöglichen, ohne sich auf das Verspotten privater Methoden verlassen zu müssen.
Das obige ist der detaillierte Inhalt vonWann sollten Sie private Methoden in PHPUnit verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!