为什么不是';我的PHPUnit嘲笑Predis客户是否符合我的期望?

为什么不是';我的PHPUnit嘲笑Predis客户是否符合我的期望?,php,mocking,redis,phpunit,predis,Php,Mocking,Redis,Phpunit,Predis,我想在PHPUnit测试中模拟Predis客户端。当我调用我试图模拟的方法时,在测试结束时,PHPUnit告诉我没有达到预期 下面是重现我的问题的代码示例: class MockRedisTest extends \PHPUnit_Framework_TestCase { private $mockRedis; public function testMockRedis() { $mockRedis = $this->getMock('Predis\\Client');

我想在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) mockredist::testMockRedis 调用1次时,方法名称等于的预期失败。 方法应被调用1次,实际调用0次

为什么??是不是因为Predis客户端似乎在使用_调用来响应与redis命令匹配的方法调用

更新:我得到的印象是它与调用方法有关。将代码更改为此代码将起作用:

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");
}
但我不确定我对这个是否满意。有没有更好的方法来模拟使用_调用代理方法的类?

我认为您可以使用

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

强制模拟对象了解您的魔法功能。这将mock的功能限制为方法
exists()
。您必须特别包括要模拟的所有其他方法。

如果要模拟特定的服务器配置文件并确保您没有调用不同服务器版本的方法,请使用

对于Phpunit 5,使用

$this->createPartialMock('Predis\\Client', ['exists']);
让您的mock知道“exists”方法(或任何其他redis本机命令)