@igortelmenko

Как правильно работать с БД в тестах Laravel?

Приветствую всех!

Делаю функциональные тесты для приложения на Laravel. Появилось несколько вопросов.
Излагаю. :)

1. Различия make и create методов фабрики
factory(App\User::class)->make();
factory(App\User::class)->create();

Если я верно понял, то create() пишет в таблицу БД, а make() создает только объект модели. Правильно?
Но если так, то можно-ли жизненный пример для чего может понадобиться make()?

2. Правильно ли я понимаю, что при запуске даже одного теста, например, phpunit --filter testNameSingleTest фреймворк откатывает все миграции, а затем (непосредственно перед запуском теста) выполняет их снова. У меня как-то была ошибка в методе down() одной миграции и при запуске теста я получил ошибку. Что и навело меня на такие мысли. Не сильно ли расточительно перезапускать все миграции перед одним тестом? И может быть это как то можно отключить? Пусть бы очищались (удалялись) только записи, которые создавал сам тест.

3. Разница в двух подходах отката БД DatabaseMigrations и DatabaseTransactions. С одной стороны понятно, что первый подход использует миграции, а второй оборачивает каждый тест в транзакцию.
Но проблема в деталях.
а) Какой из методов используется по-умолчанию? У меня по-умолчанию, получается, что все записи остаются в БД после теста. Правильно?
б) Пробовал явно указать DatabaseMigrations и получил после теста базу данных без записей, созданных тестом. В том виде, который можно получить сразу после миграций.
в) Пробовал явно указать DatabaseTransactions и указать в специальном параметре список соединений (их 2 пока), но после теста записи в БД почему-то остались. Правильно ли это? Или я что-то делал неправильно. Что может быть причиной?
г) Написано, что очистка происходит после каждого теста. Тестом считается весь класс теста? Или один метод? Вопрос терминологии.

Может что подскажите...
  • Вопрос задан
  • 1452 просмотра
Пригласить эксперта
Ответы на вопрос 1
abler98
@abler98
Software Engineer
Если я верно понял, то create() пишет в таблицу БД, а make() создает только объект модели. Правильно?

Да, именно так.

Но если так, то можно-ли жизненный пример для чего может понадобиться make()?

Возможно когда-то потребуется создать модель без необходимости записи в БД, разве такого не может быть?

2. Правильно ли я понимаю, что при запуске даже одного теста, например, phpunit --filter testNameSingleTest фреймворк откатывает все миграции, а затем (непосредственно перед запуском теста) выполняет их снова.

Запуск миграций/транзакций происходит внутри метода setUp базового класса (TestCase), думаю это должно ответить на Ваш вопрос.

а) Какой из методов используется по-умолчанию? У меня по-умолчанию, получается, что все записи остаются в БД после теста. Правильно?

По умолчанию происходит обычная запись в БД.

б) Пробовал явно указать DatabaseMigrations и получил после теста базу данных без записей, созданных тестом. В том виде, который можно получить сразу после миграций.

Так и должно быть, при использовании DatabaseMigrations в тестах, перед началом выполнения теста накатываются миграции (выполняется команда migrate), а после завершения - migrate:rollback. Я обычно использую миграции + отдельная БД для тестов. Советую глянуть в файл phpunit.xml , там можно переопределять ENV значения.

г) Написано, что очистка происходит после каждого теста. Тестом считается весь класс теста? Или один метод? Вопрос терминологии.

Очистка происходит в методе tearDown, то есть происходит это для каждого метода теста. Тоже самое касается запуска миграций/транзакций.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы