2011-10-18 7 views
5

私はPHPUnitテストでPredisクライアントをモックしようとしています。私が試したメソッドを呼び出すと、テストの最後に、期待通りのものではないとPHPUnitから伝えられています。Predis Clientの私のPHPUnit模擬が私の期待に合っていないのはなぜですか?

ここに私の問題を再現するコードサンプルです:

class MockRedisTest extends \PHPUnit_Framework_TestCase { 
private $mockRedis; 

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("exists") 
     ->with($this->equalTo("query-key")) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

}

そして、PHPUnitがメソッドが呼び出されなかったと考えて:

1)MockRedisTest :: testMockRedis 期待に失敗しましたメソッド名は1回呼び出されたときと同じです。 メソッドは1回呼び出され、実際には0回呼び出されると予想されました。

なぜですか?それはPredisクライアントがredisコマンドに一致するメソッド呼び出しに__callを使って応答しているように見えるからですか?

更新:__callメソッドと何か関係があるとの印象を受けます。このコードを変更すると、次のようになります。

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("__call") 
     ->with("exists", $this->equalTo(array("query-key"))) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

私はこれに満足しています。プロキシメソッドに__callを使用するクラスをモックする良い方法はありますか?

答えて

8

私はあなたの魔法の機能を知ってモックオブジェクトを強制的に

$mockRedis = $this->getMock('Predis\\Client', array('exists')); 
// ... 

を使用することができると思います。しかし、これは方法exists()へのモックの能力に限界があります。他のすべての方法を具体的に含める必要があります。

+0

完璧です。ありがとう。 –

0

あなたは、特定のサーバプロファイルを模擬し、あなたが別のサーバーバージョンのメソッドを呼び出していないことを確認してください、PHPUnitの5について

<?php 
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands())); 
0

を使用し、あなたを作るために

$this->createPartialMock('Predis\\Client', ['exists']); 

を使用したい場合"存在する"方法(または他の赤いネイティブコマンド)について知っていてください。

関連する問題