Удивительная проблема с Auth user и тестами
После включения этой функции у меня отказали некоторые тесты, связанные с preventAccessingMissingAttributes
. Эта функция гарантирует, что при попытке получить доступ к свойству, не существующему в модели, будет выдана ошибка, а не просто молча возвращён null
.
В моем случае я знал, что эти свойства существуют в модели, но мои тесты завершались с ошибками. Проблема связана с тем, как метод actingAs
в тестах влияет на $request->user
, доступный в коде приложения.
Рассмотрим этот фрагмент теста:
$user = User::factory()->create(['xyz' => 'abc']);
$this->actingAs($user);
$this->get('/'); // остальные ассерты далее
В этом примере теста, допустим, мой маршрут содержит валидацию запроса формы, которая использует $request->user
. Эта модель User
будет иметь только те свойства, которые определены в моей фабрике, плюс переданные в метод create()
.
Если у модели User
есть другие свойства, которые не используются в данном конкретном вызове фабрики, они не будут существовать в этом тестовом запросе, и preventAccessingMissingAttributes
выдаст ошибку.
Причина в том, что, в отличие от обычного запроса, тестовый запрос не использует модель User
из базы данных. Он использует ту, что была создана внутри теста и привязана к запросу в памяти.
Исправление было простым и потребовало лишь дополнительной строки или двух в настройках теста, но оно застало меня врасплох.