Почему мой макет PHPUnit клиента Predis не соответствует моим ожиданиям? - PullRequest
5 голосов
/ 18 октября 2011

Я пытаюсь смоделировать клиента Predis в тесте PHPUnit.Когда я вызываю метод, который пытался смоделировать, в конце теста 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 для прокси-методов?

Ответы [ 3 ]

8 голосов
/ 18 октября 2011

Я думаю, вы можете использовать

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

, чтобы заставить фиктивный объект узнать о вашей магической функции.Это ограничивает возможности макета для метода exists().Вы должны будете специально включить все остальные методы для насмешки.

0 голосов
/ 08 ноября 2016

Для Phpunit 5 используйте

$this->createPartialMock('Predis\\Client', ['exists']);

Чтобы вы знали о методе "exist" (или о любой другой собственной команде redis)

0 голосов
/ 02 августа 2012

Если вы хотите смоделировать определенный профиль сервера и убедиться, что вы не вызываете методы другой версии сервера, используйте

<?php
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands()));
...