PHPUnitテストでPredisクライアントをモックアウトしようとしています。モックアウトしようとしたメソッドを呼び出すと、テストの最後に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を使用するクラスをモックするより良い方法はありますか?