Не удается получить пользователя при проверке подлинности в laravel

#laravel #authentication #automated-tests #phpunit

#laravel #аутентификация #автоматизированные тесты #phpunit

Вопрос:

Я пишу автоматические тесты для устаревшего проекта laravel, 5.8.38. У меня есть этот метод тестирования.

 public function testUserReceivesAnEmailWithAPasswordResetLink()
{
    Notification::fake();

    $user = factory(User::class)->create([
        'email' => 'john@example.com',
    ]);

    $this->post($this->passwordEmailPostRoute(), [
        'email' => 'john@example.com',
    ]);

    $this->assertNull($token = DB::table('password_resets')->first());
    Notification::assertSentTo($user, ResetPassword::class, function ($notification, $channels) use ($token) {
        return Hash::check($notification->token, $token->token) === true;
    });
}
  

Это всегда завершается неудачей, потому что пользователь не может быть восстановлен. passwordEmailPostRoute() Метод переходит к src/Illuminate/Auth/Passwords/PasswordBroker.php sendResetLink() методу, в конечном итоге переходя в src/Illuminate/Auth/EloquentUserProvider.php retrieveByCredentials() метод at.
Это всегда возвращает значение null.

Я попытался сбросить данные и запросы, но все потерпело неудачу. Любые идеи приветствуются.

Комментарии:

1. попробуйте использовать: $this-> actingAs($user,’api’); перед $this-> post

2. @OMR это не решило мою проблему, но, похоже, действительно полезное дополнение, спасибо.

Ответ №1:

Похоже, это очень специфическая проблема, которую я вызвал для себя. Моя фабрика пользователей сгенерировала неправильные значения для поля подключения morph, что предотвратило возврат действительного пользовательского объекта. Мне пришлось сменить фабрику, и теперь проблема решена.