Удивительная проблема с 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 из базы данных. Он использует ту, что была создана внутри теста и привязана к запросу в памяти.
Исправление было простым и потребовало лишь дополнительной строки или двух в настройках теста, но оно застало меня врасплох.