我试图在 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 客户端似乎在使用 __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");
}
不确定我对此是否满意。有没有更好的方法来模拟使用 __call 代理方法的类?