PHP - альтернативы runkit для перехвата вызовов методов - PullRequest
5 голосов
/ 27 мая 2011

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

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

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

Ответы [ 2 ]

15 голосов
/ 27 мая 2011

Примечание: расширение 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'));
}

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

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

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

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

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

2 голосов
/ 09 сентября 2012

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

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

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

...