2013-09-24 2 views
23

모의하고 싶은 인터페이스가 있습니다. 나는 그 인터페이스의 구현을 조롱 할 수 있지만 인터페이스를 조롱하는 방법이 있는지 알고있다.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); 
    } 
} 

은 내가 여기 얻을 것은 :

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 

흥미롭게도, PHPUnit, mocked interfaces, and instanceof이가 작동 할 수 있습니다 제안합니다. 대신

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

또는

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

가 완전히 작동

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

사용

+0

, 그것은 사용'-()는'하지'getMock>하고는 같다 당신의 문제에 대한 해답을 찾아 냈습니다. 그러나 IIRC 여기에 귀하의 질문의 중복뿐만 아니라 존재하지만 그것을 지금 찾을 수 없습니다. – hakre

+0

흥미 롭습니다. 내 수색에서 찾지 못했습니다. 편집 해 주셔서 감사합니다. –

+0

아래의 답변을 수락하면 질문에 답변이 표시됩니다. – hakre

답변

33

!

+8

나는 그것이 작동하도록 $ mockBuilder-> setMethods ([ 'all', 'my', 'interface', 'methods'])가 필요했다. 하지만 그래, 완벽하게 작동합니다. 도와 주셔서 감사합니다. – Steve

7

나를 위해 다음 작품 : 당신이로()`getMockBuilder> - - 당신은 다른 질문 것으로 오해 한

$myMockObj = $this->createMock(MyInterface::class); 
관련 문제