2017-05-17 5 views
0

私は、コンストラクタ内のconfigInterfaceからオブジェクトを作成するServiceというモデルを持っています。PHPunit mockobject with interface

public $config; 

public function __construct( \Vendor\Module\Api\Config $config){ 
    $this->config = $config; 
} 

そして、私のunittestの設定では、以下の方法

public function Foo(){ 
    $bar = $this->config->Bar(); 
    return 'Config bar = '.$bar; 
} 

()を使用し、私は私のサービスのために、このようなmockobjectを作成

$this->serviceMock = $this->getMock(
     'Vendor\Module\Model\Service', 
     ['create'], 
     [''], 
     '', 
     true 
    ); 

これは私__construct() must be an instance of Vendor\Module\Api\Config

メッセージを表示します

私のサービスmockobjectにconfigインターフェイスをどのように追加できますか?私は私の設定インターフェイスのための新しいオブジェクトのmockobjectを作成し、私のサービスオブジェクトにこれを渡そうとしましたが、これは$bar = $this->config->Bar(); nullを渡す私のテストケースを返します。私はいつもモックのこのフォームを使用便宜上

答えて

0

PHPUnitのgetMockメソッドの3番目の引数は、コンストラクタに渡される引数です。あなたの場合、空の文字列を渡しています。これは間違いなくコンストラクタの型ヒントと一致しません。だから模擬工事は失敗します。

これを回避するには、\Vendor\Module\Api\Configオブジェクトのモックを作成し、配列に配置します。

getMockメソッドで最後に使用しているパラメータは$ callOriginalConstructorです。これをfalseに設定すると、問題が解決されます。

$this->serviceMock = $this->getMock(
     'Vendor\Module\Model\Service', 
     ['create'], 
     [''], 
     '', 
     false, 
    ); 

FYI

PHPUnitのモックオブジェクトを作成するこの方法は推奨されています。現在のバージョン(6.1)では、これを行う方法は次のようになります。

$this->serviceMock = $this->createMock('Vendor\Module\Model\Service'); 

または

$this->serviceMock = $this->getMockBuilder('Vendor\Module\Model\Service') 
        ->setMethods(['create']) 
        ->disableOriginalConstructor() 
        ->getMock(); 

嘲笑されているクラスの__constructメソッドを呼び出すことはありませんどちらも。

+0

おかげでトリック:) –

2

$this->getMockBuilder('Foo\Bar') 
    ->disableOriginalConstructor() 
    ->getMock();