Почему Laravel Dusk не предоставляют способ аутентификации пользователя? - PullRequest
2 голосов
/ 26 сентября 2019

Невозможно аутентифицировать пользователя в API в начале каждого теста, используя Laravel Dusk с Laravel Passport.

Я пробовал:
$this->actingAs(User::find(1), 'api');
$browser->loginAs(User::find(1));
Passport::actingAs($this->user);

Единственный способ аутентификации пользователя - повторять логику входа в начале каждого теста, но я очень надеюсь, что есть более простой и быстрый способ сделать это.

$browser->visit('/login')
         ->type('@email', 'example@email.com')
         ->type('@password', 'password')
         ->click('@login-button')
         ->waitForLocation('/')`

Я ожидаю, что есть ОЧЕНЬ чище и быстрее способ аутентификации пользователя перед каждым тестом.

Но вопрос в том, есть ли?

По крайней мере, читая документыи гуглят, кажется, что нет, я надеюсь, что я не прав.

1 Ответ

0 голосов
/ 26 сентября 2019

Вы можете войти, используя $browser->loginAs($user), но вам, конечно, придется создать пользователя раньше.

Что также может быть необходимо, и я помню, как долго возился с этим, сам,это зафиксировать изменения в вашей базе данных перед запуском тестового кода (т.е. $this->browse(...)).Это из-за способа проведения теста в сумерках.Все обычные модульные тесты выполняются в одном и том же процессе, который использует одно и то же соединение и поэтому имеет одинаковое состояниеDusk-тест выполняется с использованием нескольких процессов, один из которых похож на модульный тест, а другой эмулирует браузер.Поэтому необходимо внести изменения в базу данных, что обычно происходит неявно при закрытии соединения (по крайней мере, для баз данных SQLite).

Следующий, очень простой тест должен дать вам направление:

public function test_home_screen_is_accessible_by_authentication_user(): void
{
    /** @var User $user */
    $user = factory(User::class)->state('dusk')->create();
    DB::commit();

    $this->browse(function (Browser $browser) use ($user) {
        $browser->loginAs($user)
            ->visit(new HomePage);
    });
}
...