Intereting Posts
Отображение базы данных PHP в тех же самых полях с различными привязными тегами PHP-интерком не работает после обновления композитора Включить расширение PHP mongo на сайтах Microsoft Azure временная отметка unix до полуночи php GD создает прозрачное изображение png Несколько пространств имен в одном модуле в ZF2 Как получить данные в функции расширения контроллера? Автозаполнение Jquery с php-источником AJAX + jQuery … Переменные, не переходящие на PHP Предупреждение: Неверный сдвиг смещения строки в обработчике C: \ wamp \ www \ whois \ whois \ whois.gtld.php в строке 57 Как Regex заменить несколько тегов <br /> одним тегом <br />? Использование регулярного выражения для фильтрации атрибутов в xpath с php array_multisort с естественной сортировкой обновление $ _POST и переход на php через jquery без отправки Рисование единой диаграммы линейки Google с несколькими строками с использованием JSON

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

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

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

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

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

    Расширение тестового помощника PHPUnit (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')); } 

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

    Для методов stubbing и mocking вы просто используете обычную фразу 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

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