2013-09-24 4 views
23

Ich habe eine Schnittstelle, die ich gerne verspotten würde. Ich weiß, dass ich eine Implementierung dieser Schnittstelle verspotten kann, aber gibt es eine Möglichkeit, die Schnittstelle nur zu verspotten?Kann ich eine Schnittstellenimplementierung mit PHPUnit mokieren?

<?php 
require __DIR__ . '/../vendor/autoload.php'; 

use My\Http\IClient as IHttpClient; // The interface 
use My\SomethingElse\Client as SomethingElseClient; 


class SomethingElseClientTest extends PHPUnit_Framework_TestCase { 
    public function testPost() { 
    $url = 'some_url'; 
    $http_client = $this->getMockBuilder('Cpm\Http\IClient'); 
    $something_else = new SomethingElseClient($http_client, $url); 
    } 
} 

Was bekomme ich hier:

1) SomethingElseTest::testPost 
Argument 1 passed to Cpm\SomethingElse\Client::__construct() must be an instance of 
My\Http\IClient, instance of PHPUnit_Framework_MockObject_MockBuilder given, called in 
$PATH_TO_PHP_TEST_FILE on line $NUMBER and defined 

Interessanterweise PHPUnit, mocked interfaces, and instanceof würde vorschlagen, dies funktionieren könnte.

+0

Sie, dass andere Frage falsch verstanden haben, wird mit '-> getMock()' nicht '-> getMockBuilder()', wie Sie tun - und das ist, wie Sie fand die Antwort auf Ihr Problem auch. Allerdings gibt es auch ein Duplikat Ihrer Frage IIRC, aber ich kann es jetzt nicht finden. – hakre

+0

Interessant. Ich konnte es bei meiner Suche nicht finden. Danke für die Bearbeitung. –

+0

Sie können Ihre Antwort auch unten akzeptieren, damit Ihre Frage als beantwortet markiert wird. – hakre

Antwort

33

Statt

http_client = $this->getMockBuilder('Cpm\Http\IClient'); 

Verwendung

http_client = $this->getMock('Cpm\Http\IClient'); 

oder

http_client = $this->getMockBuilder('Cpm\Http\IClient')->getMock(); 

Total funktioniert!

+8

Ich musste $ mockBuilder-> setMethods (['all', 'my', 'interface', 'methods']) verwenden, um es zum Laufen zu bringen. Aber ja, funktioniert perfekt. Danke für die Hilfe. – Steve

7

Die folgenden Werke für mich:

$myMockObj = $this->createMock(MyInterface::class); 
Verwandte Themen