Heim  >  Artikel  >  Backend-Entwicklung  >  Wann sollten Sie private Methoden in PHPUnit verspotten?

Wann sollten Sie private Methoden in PHPUnit verspotten?

Barbara Streisand
Barbara StreisandOriginal
2024-10-30 04:55:28824Durchsuche

 When Should You Mock Private Methods in PHPUnit?

Private Methoden mit PHPUnit verspotten

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:

  1. Erstellen Sie ein Scheinobjekt für die zu testende Klasse:

    <code class="php">$mock = $this->getMockBuilder('A')
                ->disableOriginalConstructor()
                ->getMock();</code>
  2. Definieren Sie das erwartete Verhalten des Private Methode:

    <code class="php">$mock->expects($this->once())
        ->method('c')
        ->will($this->returnValue(YOUR_STUBBED_VALUE));</code>
  3. 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>
  4. Führen Sie Ihren Test wie gewohnt aus.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn