Модульное тестирование WordPress (PHPUnit, WP_Mock)

Click here to view original web page at www.kobzarev.com
Обложка к записи Модульное тестирование WordPress (PHPUnit, WP_Mock)

Кто еще не знаком с тестированием и модульным тестированием можете ознакомится: Автоматизация тестирования, Модульное тестирование с помощью 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.