2016-11-29 3 views
0

Ich arbeite an Komponententests und versuche, den von einer Klassenfunktion zurückgegebenen Wert zu ersetzen, der an einer anderen Stelle aufgerufen wird, an der meine Einheit getestet wird.So rufen Sie die Klasse :: function auf Mock :: function response

Ich begann zu arbeiten auf Mock Objekt, das scheint die Lösung für mich zu sein. Hier ist der Code Ich verwende:

<?php 

namespace A; 

class SomeClass 
{ 
    public function doSomething() 
    { 
     return 20; 
    } 
} 

/** 
* @group DaTest 
*/ 
class DaTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testStub() 
    { 
     // Create a stub for the SomeClass class. 
     $stub = $this 
      ->getMock('A\SomeClass', array('doSomething')) 
     ; 

     // Configure the stub. 
     $stub 
      ->expects($this->any()) 
      ->method('doSomething') 
      ->willReturn(1) 
     ; 

     $a = new SomeClass(); 

     var_dump($stub->doSomething)); // Return 1 
     var_dump($a->doSomething()); // Return 20 -.-' 
    } 
} 

Wie man sehen kann ich fühle mich gezwungen, die Mock zu verwenden „1“ zurück zu bekommen. Aber mein Ziel ist es, jede Instanz von SomeClass Return 1 aber nur für meine Unit-Tests zu machen.

Was fehlt mir? Irgendeine Idee, wie ich das erreichen kann?

Thx.

Edit: genau zu zeigen, was ich versuche ich einen anderen Code bekam zu tun, das ist:

<?php 

namespace A; 

class SomeClass2 
{ 
    public function showSomething() 
    { 
     $class = new SomeClass(); 
     // Here print 20, I want it to print 1 in my unit test 
     echo $class->doSomething(); 
    } 
} 

Alles, was ich will SomeClass2::showSomething() drucken 1 in meiner Unit-Test bekommen und 20, wenn ich es nennen in Nicht-Test-Umgebung =)

+0

zu verspotten der Lage sein, Wenn Sie ursprüngliches Verhalten der Funktion verhindern wollen, haben Sie alles richtig –

+0

Nun, ich will '' '$ a-> doSomething()' '' return " 1 "auch, weil in meinem Fall die Funktion, die ich" überschreiben "möchte, nicht direkt in meinem Test aufgerufen wird, sondern im Code einer Funktion meinen Testanruf, damit ich es nicht nachspionieren kann. – LordWeedlle

+0

Die Funktion, die Sie testen möchten, wird möglicherweise nicht korrekt geschrieben. Lassen Sie uns das Beispiel näher an Ihren ursprünglichen Code anpassen. Dann wird es einfacher sein, Ihnen zu helfen –

Antwort

1

Also was Sie tun müssen, ist injizieren Instanz von SomeClass als Argument zu showSomething() -Funktion. Als Ergebnis werden Sie Someclass

<?php 

namespace A; 

class SomeClass2 
{ 
    public function showSomething(SomeClass $classInstance) 
    { 
     echo $classInstance->doSomething(); 
    } 
} 
Verwandte Themen