Подмена встроенных php-функций

Click here to view original web page at www.kobzarev.com
Обложка к записи Подмена встроенных php-функций

Часто при написании тестов необходимо протестировать внешнюю функцию или функцию, которая встроенная в php.

Рассмотрим для примера сохранение метаполей для постов в WordPress:

В данном примере мы имеем внешние ф-ции: wp_verify_nonce, update_post_meta; и встроенную ф-цию php — filter_input.

Если с внешними функциями мы можем справится с помощью WP_Mock. То со встроенной функцией filter_input все немного сложнее т.к. она уже встроенная в php и заменить ее с помощью WP_Mock не получится. Но с этой проблемой легко справится Function Mocker.

Если запустить юнит-тест и посмотреть, что будет в переменных $nonce и $field, то они всегда будут null.

Установка Function Mocker

Function Mocker в bootstrap.php

Теперь нужно подключить библиотеку в файле bootstrap.php:

Нужно инициализровать библиотеку с помощью FunctionMocker::init и передать параметры:

  • whitelist — путь к папке, где лежат файлы проекта, которые вы будете тестировать;
  • blacklist — путь к файлам, где запрещается подмена функций;
  • redefinable-internals — массив функций, которые нужно переопределить.

Фикстуры для Function Mocker

Последним подготовительным этапом для начала тестирования это добавление фикстур:

Пример теста

Теперь начинаем писать сам тест:

Теперь все вызовы в тестовом методе filter_input возвращают строку nonce, а вызовы wp_verify_nonce и update_post_metatrue. Но нам этого малого, для хорошего теста. В коде у нас несколько раз вызывается filter_input и нам необходимо получить разные ответы:

Теперь, с помощью анонимной функции возвращаем при первом вызове строку nonce, а при втором some-text-field. В более поздних версиях можно это сделать более кратко с помощью FunctionMocker::replaceInOrder.

Осталось проверить, какие параметры мы передаем в функции:

Если вы сделали все правильно, то вы получили успешный тест � и опыт для тестирования внешних функций и встроенных в php.

Источник: WP Punk.