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代理方法的类?
我想你可以用
$mockRedis = $this->getMock('Predis\\Client', array('exists'));
// ...
Run Code Online (Sandbox Code Playgroud)
强制模拟对象知道你的魔法功能.这限制了mock对该方法的能力exists().你必须具体包括其他所有被嘲笑的方法.