2017-06-13 7 views
0

私はPHPとPHPUnitを使っているプログラマです。私はRSpecからPHPUnitへの切り替えに少し苦労してきました。PHPUnitの `expect_any_instance_of`と同等

具体的には、RSpecにはexpect_any_instance_ofと呼ばれる本当に素晴らしいスタブメソッドがあり、どのクラスのインスタンスでもスタブすることができます。

私はPHPUnitで同等のものを探すのに苦労しています。私はRemoteAPIClassObjectインスタンスの一部である方法makeCallをスタブしたい

<?php 
use PHPUnit\Framework\TestCase; 

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

は、ここでは、コードの私のシナリオです。 PHPUnitでこれを行う方法はありますか?テストスイートを実行するたびにリモートAPIを呼び出す必要はありません。

私はPHPUnit test doubles and class mocksについて読んだことがありますが、PHPUnitのすべてのスタブ/モックメソッドは、私がスタブしようとしているメソッドがコールスタックの下にあるので、スタブインスタンスを返すようです。 RSpecので

私はちょうど呼び出しをスタブにし、私は先に述べた方法を使用します。

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

を多分私の戦略がオフになっていると私は私のテストを再考する必要がありますか?

+0

こんにちは! PHPの世界へようこそ。私は過去に 'Mockery'を使用しました(PHPUnitモックは表現力豊かではありません)。 http呼び出しを嘲笑えるために、 'php-vcr'は素敵なプロジェクトです。 – fedeisas

答えて

1

あなたはクラスのモックオブジェクトを作成し、それを使用します。

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

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

これを行うのは良い方法ではありません。テストしようとしているクラスを嘲笑しています。 RemoteAPIClassObjectに渡すことができる疑似接続を受信するようにテストしているクラスを許可し、それが応答のためにスタブされるようにする方が良いでしょう。これにより、コードで実際にリモートAPI呼び出しを行う必要がなくなり、接続を柔軟に行うことができます。

私がテストしているオブジェクトについて詳しく見ないと、詳細を提供することができません。

+0

+1「あなたがテストしているクラスが模擬接続を受けることを許可する方がよいでしょう」 –