为什么我的Predis Client的PHPUnit模拟不符合我的期望?

Tom*_*tin 5 php phpunit mocking redis predis

我试图在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");
}
Run Code Online (Sandbox Code Playgroud)

}

并且PHPUnit认为该方法未被调用:

1)MockRedisTest :: testMockRedis方法名称的期望失败等于1次调用时.预计方法被调用1次,实际上被称为0次.

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

更新:我得到的印象是它与__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");
}
Run Code Online (Sandbox Code Playgroud)

不确定我对此感到满意.有没有更好的方法来模拟使用__call代理方法的类?

Ste*_*rig 8

我想你可以用

$mockRedis =  $this->getMock('Predis\\Client', array('exists'));
// ...
Run Code Online (Sandbox Code Playgroud)

强制模拟对象知道你的魔法功能.这限制了mock对该方法的能力exists().你必须具体包括其他所有被嘲笑的方法.