#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
пользователи не проходят тест?