2017-06-13 4 views
0

Ich bin ein Rails-Programmierer, der PHP und PHPUnit erforscht. Ich habe ein bisschen mit dem Wechsel von RSpec zu PHPUnit gekämpft.`expect_any_instance_of` entspricht für PHPUnit

Genauer gesagt hat RSpec eine wirklich nette Stub-Methode namens expect_any_instance_of, die es ermöglicht, jede Instanz einer Klasse zu stubben.

Ich habe Mühe, das Äquivalent in PHPUnit zu finden.

Hier ist mein Szenario in Code:

<?php 
use PHPUnit\Framework\TestCase; 

class SomeClass 
{ 
    public function testMethod() 
    { 
     $api_interface = new RemoteAPIClassObject(); 
     $result = $api_interface->makeCall() 
     $this->assertEquals('foo', $result->api_response); 
    } 
} 
?> 

Ich mag würde die Methode makeCall Stub, die Teil der RemoteAPIClassObject Instanz ist. Gibt es eine Möglichkeit, dies in PHPUnit zu tun, so dass ich nicht wirklich einen Remote-API-Aufruf an den Remote-Server machen muss, wenn ich meine Testsuite laufe?

Ich habe über PHPUnit test doubles and class mocks gelesen, aber es scheint, als ob alle PHPUnit Stub/Mock-Methoden eine Stub-Instanz zurückgeben, was ich nicht will, da die Methode, die ich versuche auszugeben, weiter unten im Call-Stack ist.

In rspec würde ich benutzen Sie einfach die Methode, die ich bereits erwähnt, den Anruf Stummel:

expect_any_instance_of(RemoteAPIClassObject).to receive(:makeCall).and_return(some_stubbed_object)

Vielleicht ist meine Strategie weg ist und ich brauche, um meine Prüfung zu überdenken?

+0

Hallo! Willkommen in der PHP-Welt. Ich habe in der Vergangenheit "Mocker" verwendet (PHPUnit ist nicht so ausdrucksstark). Für das Mocking von http-Aufrufen ist 'php-vcr' ein nettes Projekt. – fedeisas

Antwort

1

Sie würden ein Mock-Objekt Ihrer Klasse erstellen und dieses verwenden.

$api_interface = $this->getMockBuilder('RemoteAPIClassObject') 
    ->setMethods(['makeCall']) 
    ->getMock(); 

$api_interface->expects($this->once()) 
    ->method('makeCall') 
    ->willReturn((object)['api_response' => 'foo']); 

Dies zu tun ist jedoch keine gute Praxis. Wir verspotten die Klasse, die wir testen wollen. Es wäre besser zu erlauben, dass die Klasse, die Sie testen, eine Scheinverbindung erhält, die wir an die RemoteAPIClassObject übergeben können und sie für eine Antwort stubbed lassen. Dies würde ermöglichen, dass Ihr Code den Remote-API-Aufruf nicht wirklich ausführen muss und Flexibilität in den Verbindungen ermöglicht, die Sie vornehmen können.

Ich kann nicht mehr Details bereitstellen, ohne mehr über das Objekt zu sehen, das Sie testen.

+0

+1 für 'Es wäre besser zuzulassen, dass die Klasse, die Sie testen, eine Scheinverbindung erhält' –