5

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を使用するクラスをモックするより良い方法はありますか?

4

3 に答える 3

8

使えると思います

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

モックオブジェクトに魔法の機能を強制的に認識させます。ただし、これはモックの機能をメソッドに制限しexists()ます。モックする他のすべてのメソッドを具体的に含める必要があります。

于 2011-10-18T13:26:52.557 に答える
0

特定のサーバー プロファイルをモック化し、別のサーバー バージョンのメソッドを呼び出していないことを確認する場合は、次を使用します。

<?php
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands()));
于 2012-08-02T14:45:02.073 に答える
0

Phpunit 5 の場合は、

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

「exists」メソッド (またはその他の redis ネイティブ コマンド) についてモックに知らせるには

于 2016-11-08T09:23:38.693 に答える