Часто при написании тестов необходимо протестировать внешнюю функцию или функцию, которая встроенная в 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_meta
— true
. Но нам этого малого, для хорошего теста. В коде у нас несколько раз вызывается filter_input и нам необходимо получить разные ответы:
Теперь, с помощью анонимной функции возвращаем при первом вызове строку nonce
, а при втором some-text-field
. В более поздних версиях можно это сделать более кратко с помощью FunctionMocker::replaceInOrder
.
Осталось проверить, какие параметры мы передаем в функции:
Если вы сделали все правильно, то вы получили успешный тест � и опыт для тестирования внешних функций и встроенных в php.
Источник: WP Punk.
Читать полностью www.kobzarev.com