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 客户端似乎在使用 __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 代理方法的类?

4

3 回答 3

8

我认为你可以使用

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

强制模拟对象了解您的魔术功能。但是,这限制了 mock 对该方法的能力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']);

让您的模拟了解“存在”方法(或任何其他 redis 本机命令)

于 2016-11-08T09:23:38.693 回答