Удивительная проблема с Auth user и тестами

Источник: «A surprising issue with the Auth user and tests»
Этот совет продолжает начатую вчера тему, связанную с проверкой строгости Eloquent.

После включения этой функции у меня отказали некоторые тесты, связанные с preventAccessingMissingAttributes. Эта функция гарантирует, что при попытке получить доступ к свойству, не существующему в модели, будет выдана ошибка, а не просто молча возвращён null.

В моем случае я знал, что эти свойства существуют в модели, но мои тесты завершались с ошибками. Проблема связана с тем, как метод actingAs в тестах влияет на $request->user, доступный в коде приложения.

Рассмотрим этот фрагмент теста:

$user = User::factory()->create(['xyz' => 'abc']);
$this->actingAs($user);

$this->get('/'); // остальные ассерты далее

В этом примере теста, допустим, мой маршрут содержит валидацию запроса формы, которая использует $request->user. Эта модель User будет иметь только те свойства, которые определены в моей фабрике, плюс переданные в метод create().

Если у модели User есть другие свойства, которые не используются в данном конкретном вызове фабрики, они не будут существовать в этом тестовом запросе, и preventAccessingMissingAttributes выдаст ошибку.

Причина в том, что, в отличие от обычного запроса, тестовый запрос не использует модель User из базы данных. Он использует ту, что была создана внутри теста и привязана к запросу в памяти.

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

Дополнительные материалы

Предыдущая Статья

Новое в Symfony 6.4: Улучшения DX (часть 2)

Следующая Статья

Как установить или обновить PHP 8.3 на Ubuntu и Debian