Почему Laravel Dusk не предоставляет способ аутентификации пользователя?

Невозможно аутентифицировать пользователя в 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', '[email protected]')
         ->type('@password', 'password')
         ->click('@login-button')
         ->waitForLocation('/')`

Я ожидаю, что есть НАМНОГО более чистый и быстрый способ аутентификации пользователя перед каждым тестом.

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

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


person Cecily Miller    schedule 26.09.2019    source источник


Ответы (1)


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

Что также может быть необходимо, и я помню, что сам долго возился с этим, так это зафиксировать изменения вашей базы данных перед запуском тестового кода (т.е. $this->browse(...)). Это связано с тем, как выполняется тест Dusk. Обычные модульные тесты выполняются в одном процессе, который использует одно и то же соединение и, следовательно, имеет одно и то же состояние. Тест 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);
    });
}
person Namoshek    schedule 26.09.2019
comment
Это не относится к аутентификации API. Вы можете легко аутентифицировать пользователя с помощью Dusk, если ваше приложение использует базовую аутентификацию. Как показывает ваш пример. Лично я использую $this->seed() для получения пользователей и других необходимых вещей, хотя. Но это не по теме. - person Cecily Miller; 26.09.2019
comment
Что ты имеешь в виду? Часть модульного теста аутентифицируется с использованием API драйвера chrome для аутентификации. - person Namoshek; 26.09.2019
comment
Аутентификация пользователей на основе токенов. Это нужно сделать, настроив файлы cookie, однако Laravel Dusk, похоже, не предлагает способ сделать это, даже если Laravel предоставляет пакет аутентификации API, называемый Passport, который я использую в этом случае. Я думаю, что единственный способ сделать это - использовать хакерские трюки для управления файлами cookie перед каждым тестом, но это просто грустно, что это не встроено в ядро ​​​​или, по крайней мере, не задокументировано идеи о том, как этого добиться. - person Cecily Miller; 26.09.2019
comment
Не знаю, зачем вам тестировать API или интерфейс API (SPA) с помощью Dusk. API — это уже интерфейс, который вы можете хорошо протестировать с помощью функциональных тестов. И SPA следует протестировать с помощью тестовой среды JS. Так что да, в основном запутался. - person Namoshek; 26.09.2019
comment
У меня есть наборы функциональных тестов для моих конечных точек API и т. д., а также наборы тестов для моего внешнего интерфейса, но e2e — это последний набор тестов, которого мне не хватает, а Laravel Dusk предназначен для тестов e2e. Конечно, я бы с удовольствием использовал другое программное обеспечение, такое как Cypress, но, поскольку мой бэкенд — Laravel, проще использовать Laravel Dusk. Например, проще обновить БД. - person Cecily Miller; 26.09.2019
comment
Или, по крайней мере, я думал, что будет проще использовать Laravel Dusk. - person Cecily Miller; 26.09.2019
comment
У меня нет опыта с этим, но $browser->loginAs() позволяет вам передать охрану в качестве второго параметра (public function loginAs($userId, $guard = null)). Это не то же самое, что actingAs(), который используется для тестирования функций. Если все это не сработает, я не тот человек, чтобы помочь, извините. - person Namoshek; 26.09.2019
comment
Да, я знаю, и я пытался пройти api как охранник, но не повезло. Не беспокойтесь, спасибо за ваше время. Я ценю это. Возможно, мне придется повторять логику входа в систему в начале каждого теста, пока я не найду лучший способ сделать это. - person Cecily Miller; 26.09.2019
comment
Я предполагаю, что вы разрабатываете SPA в качестве внешнего интерфейса, а это означает, что вам нужно каким-то образом установить токен аутентификации в хранилище сеансов или локальном хранилище вашего браузера (после аутентификации пользователя для создания токена). Возможно, это можно сделать с помощью какой-либо конфигурации драйвера Chrome, но, как я уже сказал, мне это неизвестно. - person Namoshek; 26.09.2019