Модульное тестирование с помощью PHPUnit

Click here to view original web page at www.kobzarev.com
Обложка к записи Модульное тестирование WordPress с помощью Brain Monkey

Кто еще не знаком с тестированием и модульным тестированием можете ознакомится: Автоматизация тестирования, .

Тестирование тем и плагинов под WordPress имеет одну большую проблему — взаимодействие с ядром. Решить ее можно с помощью библиотек Brain-WP/BrainMonkey или 10up/WP_Mock.

Как писать тесты с помощью 10up/WP_Mock вы можете прочитать в статье: Модульное тестирование WordPress (PHPUnit, WP_Mock), но а сейчас разберемся с Brain Monkey.

Библиотека Brain Monkey помогает делать заглушки для функций и классов из ядра WordPress.

Установка библиотеки Brain-WP/BrainMonkey для тестирования WordPress

Устанавливаем библиотеку через composer:

Для работы библиотеки нужно использовать фикстуры setUp и tearDown:

Теперь мы можем делать заглушки абсолютно для любых функций и классов WordPress.

Возможности библиотеки

Brain\Monkey\Functions\when;

Данная функция нужна для того, чтобы при вызове функции вернуть какой-то результат.

justReturn

При помощи when мы делаем мок для функции function_name и при ее вызове будет возвращен результат из метода justReturn.

returnArg

При помощи when мы делаем мок для функции function_name и при ее вызове будет возвращен аргумент функции под номером из метода returnArg.

Это очень удобно, когда нам нужно использовать функции для очистки переменных или очистки данных перед выводом(sanitize_*, esc_*).

justEcho

При вызове функции function_name выводим на экран текст из метода justEcho.

alias

Вызов функции duplicate мы заменяем на нашу функцию.

При вызове функции bigger будет вызвана функция strtoupper.

Brain\Monkey\Functions\stubs;

Функция для массовой замены функций:

При вызове каждой из функций будет возвращаться первый аргумент, который был в нее передан. Тоже самое что и when( 'func1' )->returnArg(), но массово.

Так же можно вторым параметром указать результат функций:

Или еще круче, передав массив ключ-значени, в котором ключ — название функции, а значении примитив или callback.

Подводные камни

null нельзя передать, как результат функции, поэтому используйте __return_null для этого:

Если вам нужно замокать функцию, которая возвращает callback. Поэтому нужно указать callback, который возвращает callback.

Brain\Monkey\Functions\expect

Основной инструмент для заглушек функций. В нем можно указать сколько раз, с какими аргументами и что вернула функция.

Функция была вызвана n-раз

Функция была вызвана с такими параметрами:

  • withAnyArgs() — с любыми аргументами, с любым их количеством или вовсе без них;
  • withNoArgs() — без аргументов;
  • with( ... ) — указываем точные аргументы.
  • with( Mockery::type( 'int' ), Mockery::type( 'string' ) ) — первый аргумент любое число, а второй — любая строка;
  • with( Mockery::any() ) — первый аргумент может быть абсолютно любого типа;
  • with( Mockery::anyOf( 'a', 2, true ) ) — первый аргумент любой из списка;
  • with( Mockery::not( 'a', 2, true ) ) — любой, кроме тех, что в списке.

Функция возвращает

  • andReturn( 'Baz!' ) — функция вернет Baz!;
  • andReturn( 'One', 'Two' ) — функция вернет One в первый раз и Two во второй;
  • andReturnValues( 'One', 'Two' ) — функция вернет One в первый раз и Two во второй;
  • andReturnNull() — функция вернет null;
  • andReturnUsing( callback ) — функция вернет callback;
  • andThrow( 'RuntimeException' ) — функция выбросит исключение RuntimeException.

Тестирование хуков

Тестирование подключений хуков

Тестируемый класс:

Проверить подключение хуков можно с помощью функций has_action и has_filter:

Тестирование наличия хуков

Пример класса:

Проверяем с помощью did_action и applied, которые возвращают кол-во вызовов данных хуков:

Как видите из прошлого примера, то мы не проверили, с какими параметрами вызван хук и для фильтра не подменили результат.

Поэтому тестировать лучше и более качественее с помощью Brain\Monkey\Actions\expectDone и Brain\Monkey\Filters\expectApplied:

Вывод

С помощью Brain Monkey мы можем тестировать большую часть функциональности WordPress. А как вы считаете что лучше WP_Mock или Brain Monkey?

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