Передача по ссылке в обратном вызове при mocking в PHPUnit - PullRequest
3 голосов
/ 02 марта 2011

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

Итак, я создал обратный вызов, который очень просто высмеивает поведение.

Этот тест проходит, если я создаю новый объект, основанный на этом интерфейсе, но я хотел бы смоделировать интерфейс.

Проверенный метод setUp вызывается нормально, и вызов getVar ('testing') в моем обратном вызове возвращает значение. Однако мое утверждение не выполняется, потому что это значение недоступно.

Кажется, вы не можете сделать это в PHPUnit? Если я не глупый.

Краткое объяснение потока кода; Код в getVar вызывает метод, который вызывает setUp для добавленного плагина. Когда он вызывает «setUp», он переходит в «$ this». Это $ this, которое я ожидаю передать по ссылке и которое работает с «реальным» объектом.

class DefaultRendererTest extends \PHPUnit_Framework_TestCase
{

    public function testSetGetVar()
    {
        $theme = $this->getMock('ThemeInterface');

        $plugin = $this->getMock('PluginInterface');
        $plugin->expects($this->once())
          ->method('setUp')
          ->will($this->returnCallback(function($r){

              $r->setVar('testing', "fooBar");

        }));

        $renderer = new DefaultRenderer($theme, null);
        $renderer->addPlugin($plugin);
        $this->assertEquals('fooBar',$renderer->getVar('testing'));
    }
}

Для информации вот интерфейс, DefaultRenderer реализует RendererInterface

interface PluginInterface
{
    function setUp(RendererInterface $renderer);
}

1 Ответ

4 голосов
/ 02 марта 2011

ОК, из интереса, я разыскал проблему. Кажется, что PHPUnit автоматически клонирует параметры до того, как произойдет фактический вызов. Я не вижу реальной причины для этого, но, возможно, есть одна. Если взглянуть на Framework/MockObject/Invocation/Static.php, есть только один способ, как этого избежать (на основе встроенного фиктивного кода): реализовать приватный метод __clone() в DefaultRenderer.

Я бы также предложил вам обратиться в IRC или в список рассылки PHPUnit об этом поведении или в библиотеке фиктивных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...