
Кто еще не знаком с тестированием и модульным тестированием можете ознакомится: Автоматизация тестирования, Модульное тестирование с помощью PHPUnit.
Тестирование тем и плагинов под WordPress имеет одну большую проблему — взаимодействие с ядром. Решить ее можно с помощью библиотеки 10up/WP_Mock.
Библиотека 10up/WP_Mock помогает делать заглушки для ф-ций и классов из ядра WordPress.
Установка библиотеки 10up/WP_Mock для тестирования WordPress
Устанавливаем библиотеку через composer:
Настройка файла конфигурации phpunit.xml
Создаем файл конфига /tests/phpunit/phpunit.xml:
Важными являются настройки:
Эти настройки позволяют преобразовать все errors, notices, warnings в exception, а be Strict About Tests That Do Not Test Anything разрешает тестам не возвращать assert в конце.
Создание bootstrap.php
Создаем /tests/phpunit/bootsrap.php:
WP_Mock::bootstrap() запускает библиотеку WP_Mock.
В тестовых классах нужно использовать фикстуры setUp, tearDown:
Теперь мы можем делать заглушки абсолютно для любых функций и классов WordPress.
Первый тест с помощью WP_Mock
Пример 1. Тестируем добавление метаполя при сохранении поста:
Таким образом, если в методе save кто-то поменяет поле для nonce или уберет проверку, то тесты буду провалены. Так же мы проверили с какими данными должно обновляться метаполе. Первый параметр — этот тот же $post_id, который приходит первым аргументом на хук save_post. Жестко указываем, как называется метаполе ‘field’, не важно, какие данные могут приходить в последний параметр ( ‘*’ ). И вызваться должно все по 1 разу.
Заглушки для всех WordPress функций (WP_Mock::userFunctions)
Для этого служит статический метод WP_Mock::userFunction, который мы уже использовали в примере выше. Это один из основных инструментов для модульного тестирования для WordPress. После его освоение можно будет легко тестировать большую часть функций и методов, написаные с использованием WordPress.
Теперь рассмотрим данный метод более подробнее. Первый параметр это название функции, которую мы хотим подменить. Второй параметр это массив аргументов. На данный момент возможны такие аргументы: times, args, return и return_in_order.
Аргумент times
Аргумент times — означает, что функция будет вызвана столько раз, сколько указано в агрументе. Примеры:
Аргумент args
Аргумент args — означает, что функция должна быть вызвана с такими параметрами. Примеры:
Аргумент return
Аргумент return — результат функции будет тот, который передается в данный аргумент. Примеры:
Аргумент return_in_order
Аргумент return_in_order — результат функции будет при каждом вызове в порядке переданные в массиве. Пример:
Тестирование хуков
Для do_action
, add_action
, apply_filters
, add_filter
используются свои способы тестирования.
Тестирование добавление хуков add_action, add_filter (expectActionAdded, expectFilterAdded)
Добавление хуков тестируется с помощью методов expectActionAdded и expectFilterAdded. Мы ожидаем, что тестируемый метод/функция будет подключать свои хуки. Пример:
Тестирование наличия хуков do_action, apply_filters (expectAction, expectFilter onFilter)
Наличие хуков тестируется с помощью методов expectAction, expectFilter и onFilter. Мы ожидаем, что тестируемый метод/функция будет использовать свои хуки. Пример:
С помощью onFilter можно более детально протестировать наличие фильтров.
Тестирование глобальных переменных
Да-да WordPress грешит такими вещами, как глобальные переменные. Разберем работу с базой. Самый распространенный пример с использованием глобальных переменных это работа БД.
Пример кода, аналог функции get_option():
Тестирование примера:
В целом данных возможностей достаточно, чтобы начать тестировать свой код на WordPress.
Источник: WP Punk.
Читать полностью www.kobzarev.com