Чудо Mockery для заглушек в unit тестах

Click here to view original web page at www.kobzarev.com
Обложка к записи Чудо Mockery для заглушек в unit тестах

Потрясающая библиотека Mockery, которая сделает вашу жизнь лучше во время написания тестов.

Она помогает создавать быстрее и проще стабы и моки и так же используется в большинстве тестовых фрейморков. И что самое приятное, библиотека очень простая.

Его основная цель состоит в том, чтобы предложить тестовую двойную инфраструктуру с лаконичным API, способным четко определять все возможные объектные операции и взаимодействия с использованием удобочитаемого предметно-ориентированного языка (DSL).

документация Mockery

Установка Mockery

1composer require --dev mockery/mockery

Создание тестовых двойников Mockery

Огрызки(Stubs) и Заглушки(Mocks) в Mockery

Создать стаб/мок можно для класса, интерфейса или класса с интерфейсами:

123$mock = \Mockery::mock( '\Some\Class\Name' );$mock = \Mockery::mock( '\Some\Interface\Name' );$mock = \Mockery::mock( '\Some\Class\Name, \Some\Interface\Name, \Some\Interface\OtherName' );

Затем можно описать поведение мока можно с помощью метод. Например:

В целом детально описываем, что в данном тесте должен быть вызван метод some_method с аргументами 'arg1', 'arg2', 4 раза и вернуть строку awesome.

Шпионы(Spies) в Mockery

Создать шпиона можно для класса, интерфейса или класса с интерфейсами:

Пример:

Шпионы отличаются от моков тем, что их задача заключается в том, чтобы проверить, что метод был вызван после вызова тестируемого метода. Для шпионов можно вызвать абсолютно любой метод во время теста, а потом проверить, что метод был вызван.

Тестовые двойники для абстрактных классов и интерфейсов

Тестовые двойники для абстрактных классов и интерфейсов создаются точно так же, как и для обычных классов:

Частичные тестовые двойники

Частичный тестовый двойник это реальный класс с реальными методами, который обладает всеми свойствами обычного двойника. Так же частичные двойники вызываются БЕЗ вызова конструктора по умолчанию.

Создаем простой мок или шпиона и делаем из него частичного тестового двойника с помощью вызова метода makePartial, затем методы этого класса можно будет вызывать или переопределить с помощью shouldReceive:

Так же можно сделать частичный двойник у которого можно указать явно, какие методы должны быть у него реальные:

Думаю тут понятно, что при создании мока можно указать, какие методы реальные или какие «фейковые» с помощью символа !(отрицания).

Если нам нужно вызвать частичный тестовый двойник с конструктором или передать в конструктор аргументы то их можно передать через массив во 2-й или 3-й параметр:

Тестовые двойники для final классов

Так как final классы нельзя наследовать, то необходимо использовать данную конструкцию для создание мока для них:

Тестовый двойник с свойствами и методами другого класса

С помощью метода namedMock() мы можем расширить нашего тестового двойника. Пример тестируемого класса:

Мы хотим проверить успешный сценарий и для этого нам нужно будет добавить статические свойства

Теперь тестовый двойник обладает статическими методами FetcherStub и мы можем протестировать наш класс.

Псевдоними(alias) для Mockery

Псевдонимы нужны для того, чтобы сделать заглушки для статических методов:

Перезагрузка(Overload) классов с помощью Mockery

С помощью overload вы можете создать глобальный мок, который будет доступен при создании новых объектов. С данной фичей очень аккуратно нужно работать и в очень крайних случаях. Если вы используете ее, то скорее всего у кого-то говнокод :). Но это оправдано при тестировании порождающих паттернов например какой-нибудь фабрики.

С помощью overload можно переопределить Hard Dependency. Как это сделать можно посмотреть в статье: Как тестировать Hard Dependencies.

Заглушка для типов данных

Мы можем указать, что метод будет вызван с определенным параметром. Вариантов, как это сделать просто очень много:

Заглушки для защищенных методов

В документации не рекомендуют это делать, но все же Mockery это умеет делать. Я уже описывал как тестировать приватные методы и все сложности связанные с этим.

Вывод

Mockery помогает легче использовать тестовых двойников (стабы/моки/шпионы) и расширяет их функциональность. Так же очень сильно упрощает тестирование с помощью частичных моков, дает возможность создавать заглушки для типов данных и переопределять глобально классы для тестирования жестких зависимостей.

Для написания тестов под WordPress вам точно понадобиться данная библиотека.

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