2016-07-22 12 views
2

Ich versuche, die unter Klasse zu testen PHPUnit mitPHPUnit verspottet Methode gibt null

class stripe extends paymentValidator { 
    public $apiKey; 

    public function __construct ($apiKey){ 
     $this->apiKey = $apiKey; 
    } 

    public function charge($token) { 
     try { 
      return $this->requestStripe($token); 
     } catch(\Stripe\Error\Card $e) { 
      echo $e->getMessage(); 
      return false; 
     } 
    } 

    public function requestStripe($token) { 
     // do something   
    } 
} 

Meine Testskripte wie unten:

class paymentvalidatorTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @test 
    */ 
    public function test_stripe() { 
     // Create a stub for the SomeClass class. 
     $stripe = $this->getMockBuilder(stripe::class) 
      ->disableOriginalConstructor() 
      ->setMethods(['requestStripe', 'charge']) 
      ->getMock(); 

     $stripe->expects($this->any()) 
      ->method('requestStripe') 
      ->will($this->returnValue('Miaw')); 

     $sound = $stripe->charge('token'); 
     $this->assertEquals('Miaw', $sound); 
    } 
} 

Mit meinem Testskript erwartete ich den Test Doppel der stripe :: charge() -Methode wird genauso ausgeführt wie in der ursprünglichen Klasse definiert und stripe :: requestStripe() gibt 'Miaw' zurück. Daher sollte $ stripe-> charge ('token') auch 'Miaw' zurückgeben. Wenn ich jedoch den Test ausführe, bekomme ich:

Failed asserting that null matches expected 'Miaw'. 

Wie soll ich das beheben?

+0

Sie haben die Methode 'charge' nicht eingerichtet, um irgendetwas zurückzugeben, daher wird 'null' zurückgegeben. – zerkms

Antwort

4

Wo Sie setMethods anrufen, Sie sagen PHPUnit, die das Mock-Klasse das Verhalten dieser Methoden verspotten sollte:

->setMethods(['requestStripe', 'charge']) 

In Ihrem Fall es, wie Sie teilweise sieht die Klasse wollen verspotten, so dass requestStripe() kehrt Miaw, aber Sie wollen charge seinen ursprünglichen Code auszuführen - Sie sollten nur charge aus den verspotteten Methoden entfernen:

$stripe = $this->getMockBuilder(stripe::class) 
    ->disableOriginalConstructor() 
    ->setMethods(['requestStripe']) 
    ->getMock(); 

$stripe->expects($this->once()) 
    ->method('requestStripe') 
    ->will($this->returnValue('Miaw')); 

$sound = $stripe->charge('token'); 
$this->assertEquals('Miaw', $sound); 

Während Sie gerade dabei sind Sie Geben Sie an, wie oft Sie erwarten, dass requestStripe() aufgerufen wird - dies ist eine zusätzliche Bestätigung ohne zusätzlichen Aufwand, da die Verwendung von $this->any() Ihnen keinen zusätzlichen Vorteil bietet. Ich habe im Beispiel $this->once() mit einbezogen.