PHP - альтернативы runkit для перехвата вызовов методов

У меня есть очень недружелюбный к тесту код (по меньшей мере), который мне нужно протестировать. Рефакторинг, к сожалению, не вариант. Я должен протестировать код как есть, без возможности его изменения.

Чтобы сделать это, я думал о перехвате вызовов функций и динамическом изменении их функций, чтобы я мог выполнять свои тесты, так как мне нужны некоторые функции и методы для возврата известных значений, а также другие, которые делают запросы, подключаются к базе данных и т. Д., чтобы прекратить делать это и вернуть то, что мне нужно, чтобы они вернулись. Есть ли способ сделать это без runkit_method_redefine(), который предпочтительно не является "ЭКСПЕРИМЕНТАЛЬНЫМ" и все еще поддерживается? Может быть, альтернатива рункиту? Может быть, лучше?

Редактировать: будет использовать тестовые дубликаты PHPUnit и функции PHP 5.3.2 для обеспечения доступности приватных методов, если мне понадобятся эти функции.

2 ответа

Решение

Примечание. Расширение Test-Helper заменено на https://github.com/krakjoe/uopz

Расширение PHPUnit Test Helper (PECL) позволяет переопределять / перехватывать / заглушать / пересмешивать жестко запрограммированные зависимости с вашими собственными реализациями:

protected function setUp()
{
    $this->getMock(
      'Bar',                    /* name of class to mock     */
      array('doSomethingElse'), /* list of methods to mock   */
      array(),                  /* constructor arguments     */
      'BarMock'                 /* name for mocked class     */
    );

    set_new_overload(array($this, 'newCallback'));
}

Это также позволяет перехватывать оператор выхода и создание экземпляра:

Для методов создания заглушек и насмешек вы просто используете обычную среду насмешек PHPUnit. Увидеть

Вы также можете использовать Mockery с PHPUnit:

Другой вариант будет использовать http://antecedent.github.io/patchwork

Patchwork - это библиотека PHP, которая позволяет переопределять пользовательские функции и методы во время выполнения, свободно копируя функциональность. runkit_function_redefine в чистом коде PHP 5.3, который, помимо прочего, позволяет заменять статические и приватные методы на тестовые двойники.

Расширение runkit - идеальное решение для ваших нужд. Это доказано годами моего личного опыта и описано во многих презентациях и статьях, написанных разными авторами в Интернете.

Я могу заверить вас, что функция runkit_method_redefine, а также все расширение runkit больше не являются экспериментальными (документация, размещенная на php.net, устарела). Актуальное расширение runkit можно найти на http://github.com/zenovich/runkit

С уважением, Дмитрий Зенович

Другие вопросы по тегам