У меня есть какой-то очень нечестный код (по меньшей мере), который мне нужно проверить. Рефакторинг, к сожалению, не вариант. Я должен проверить код как есть, без возможности его изменения.
Для этого я думал перехватить вызовы функций и динамически изменять то, что они делают, поэтому я могу запускать свои тесты, так как мне нужны некоторые функции и методы для возврата известных значений, и мне нужны другие, которые делают запросы, подключаются к базе данных и т. Д. , чтобы прекратить это делать и вернуть то, что мне нужно, чтобы вернуться. Есть ли способ сделать это без 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
С уважением, Дмитрий Зенович