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
С уважением, Дмитрий Зенович