2013-09-24 4 views
23

Ho un'interfaccia che mi piacerebbe prendere in giro. So che posso prendere in giro un'implementazione di questa interfaccia, ma c'è un modo per deridere l'interfaccia?Posso prendere in giro un'implementazione dell'interfaccia con PHPUnit?

<?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); 
    } 
} 

Quello che ottengo qui è:

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 

È interessante notare che, PHPUnit, mocked interfaces, and instanceof suggerirebbe questo potrebbe funzionare.

+0

Hai riconosciuto male che altra questione che usa '-> getMock()' non '-> getMockBuilder()' come si fa - e che è, come si trovato la risposta al tuo problema pure. Tuttavia IIRC esiste anche un duplicato della tua domanda, ma non riesco a trovarlo adesso. – hakre

+0

Interessante. Non riuscivo a trovarlo nella mia ricerca. Grazie per la modifica. –

+0

puoi anche accettare la tua risposta di seguito in modo che la tua domanda sia contrassegnata come risposta. – hakre

risposta

33

Invece di

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

uso

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

o

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

funziona Totalmente!

+8

Ho dovuto usare $ mockBuilder-> setMethods (['all', 'my', 'interface', 'methods']) per farlo funzionare. Ma sì, funziona perfettamente. Grazie per l'aiuto. – Steve

7

le seguenti opere per me:

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