PHPUnit: не удается подтвердить проверку входа в API

#phpunit #laravel-authentication #laravel-sanctum

#phpunit #laravel-аутентификация #laravel-sanctum

Вопрос:

Я пытаюсь следовать рекомендациям, используя TDD для построения логики аутентификации с помощью Sanctum. Но я не смог пройти тест на вход в систему.

С помощью postman маршрут работает хорошо: введите описание изображения здесь

Но тест ведет себя не так, как ожидалось. Это просто провалилось бы.

 1) TestsFeatureLoginTest::test_login_route_api
Expected status code 200 but received 401.
Failed asserting that 200 is identical to 401.
 

Я попытался передать токен в качестве заголовка или тела, и это не помогло.

Испытание

 public function test_login_route_api()
{
$this->withoutExceptionHandling();

//using RefreshDatabase
$user = User::factory()->create();

$response = $this->post('/api/login', [
    'email' => $user->email,
    'password' => $user->password,
], []);

$response->dumpHeaders();

$response->dumpSession();

$response->dump();

$response->assertStatus(200);
 

LoginController (метод, рекомендованный в документации Laravel https://laravel.com/docs/8.x/authentication#authenticating-users ):

 public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    if (Auth::attempt($credentials)) {
        // $request->session()->regenerate();
        $user = Auth::user();
        // $success['token'] = $user->createToken('MyApp')->plainTextToken;
        $success['token'] = $request->token;
        $success['name'] = $user->name;

        return response([$success, 'logged in'], 200);
    }

    return response('fail!', 401);
}
 

Маршрут:

 Route::name('api')->group(function () {
    Route::post('/login', [LoginController::class, 'login']);
    // some routes
});
 

phpunit.xml без комментариев

 <server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
 

Не уверен, что происходит, я читал несколько подобных тем, но ни одна из них мне не помогла.

Спасибо,

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

1. Если я правильно читаю ваш код.. вы не хэшируете пароли и не сохраняете их в своей базе данных в виде обычного текста? Я надеюсь, что это не так..

Ответ №1:

Хорошо, решил это.

Каким-то образом использование factory()->make() или factory()->create() с RefreshDatabase не принимало значение $user как действительное $credentials .

Мне пришлось использовать пользователя из с заполненной базой данных следующим образом: $user = User::first();

Это сделало бы тест пройденным.

Есть идеи, почему factory пользователи не проходят тест?