Трейты тестирования в Laravel

Когда я читал книгу Стаффера Мэпа Laravel Полное руководство 2-е издание, то мне показалось полезным вынести в описание трейты, которые используются в тестировании. Это четыре трейта про­верки, которые можно включить в состав любого класса теста.

RefreshDatabase
Трейт Illuminate\Foundation\ Testing\RefreshDatabase импортируется в начале файла каждого вновь генерируемого теста и представляет собой наиболее часто применяемый трейт миграции базы данных. Этот трейт появился в Laravel 5.5 и доступен только в проектах, использующих эту или более новую версию. Цель этого и других трейтов для обработки базы данных — обеспечение корректной миграции таблиц базы данных перед запуском каждого теста. Трейт RefreshDatabase обеспечивает это в два этапа. Во-первых, он выполняет однократный запуск ваших миграций в тестовой БД перед выполнением каждого теста (то есть при каждом выполнении команды phpunit, а не отдельного метода теста). Во-вторых, он обертывает каждый отдельный метод теста в транзакцию базы данных и выполняет ее откат после проверки. Это означает, что ваша база данных будет мигрировать перед выполнением тестов и возвращаться к исходному состоянию после каждой проверки без необходимо­сти повторного запуска миграции перед каждым тестом. Это самый быстрый возможный вариант. Если есть сомнения в отношении того, как вам лучше работать, не меняйте эту схему.

WithoutMiddleware
Если вы импортируете в свой класс теста трейт Illuminate\Foundation\Testing\WithoutMiddleware, то он будет отключать все middleware при выполнении любого теста этого класса. Значит, не нужно беспокоиться о middleware для аутентифи­кации, СSRF-защиты или чего-либо еще, которые могут быть полезны в реальном приложении, но только отвлекают внимание в тесте. Если нужно отключать middleware только для одного метода, а не всего класса теста, делайте вызов $this->withoutMiddleware() в начале этого метода.

DatabaseMigrations
Если вместо трейта RefreshDatabase вы импортируете Illuminate\Foundation\Testing\DatabaseMigrations, то он будет заново запускать весь набор миграций базы данных перед каждым тестом. Laravel обеспечивает это путем выполнения команды php artisan migrate: fresh в методе setUp() перед запуском каждого теста.

DatabaseTransactions
Трейт Illuminate\Foundation\Testing\DatabaseTransactions, с другой стороны, ожидает, что перед запуском тестов будет выполнена надлежащая миграция базы данных. Он обертывает каждый тест в транзакцию базы данных и производит откат этой транзакции после выполнения теста. Это означает, что после выполнения каждого теста база данных будет возвращаться в то же состояние, в котором она находилась до выполнения теста.