#laravel #laravel-passport #laravel-testing
Вопрос:
Я тестирую конечную точку api, которая аутентифицируется с помощью паспорта laravel. Я пишу тест функции для проверки oauth/token
, может ли он вернуть действительный access_token. В postman это работает нормально, но я использую другую базу данных для тестирования, поэтому, когда я запускаю тест, я всегда получаю 400 ошибок. Хотя я могу протестировать все аутентифицированные маршруты, но я застрял, когда хочу протестировать api/login
или oauth/token
конечные точки. Я запускаю команду artisan для установки паспорта для тестовой базы данных. Как получить идентификатор клиента и секрет?
В классе TestCase
public function setUp(): void
{
parent::setUp();
Artisan::call('migrate', ['-vvv' => true]);
Artisan::call('passport:install', ['-vvv' => true]);
Artisan::call('db:seed', ['-vvv' => true]);
}
Класс LoginTest
public function test_it_returns_a_valid_token_if_credentials_do_match()
{
$client = Passport::client();
$user = User::factory()->create([
'email' => $email = 'test@test.com',
'password' => $password = '12345678'
]);
$body = [
'client_id' => $client->id,
'client_secret' => $client->secret,
'username' => $email,
'password' => $password
];
$this->json('POST', '/oauth/token', $body)
->assertStatus(200);
}
Здесь $client = Passport::client()
возвращает значение null. Я не нашел никакого решения для получения учетных данных клиента oauth.
Комментарии:
1. Паспорт oauth уже протестирован их разработчиком, и он отлично работает, зачем вам нужно проверять, может ли он правильно генерировать токен?
2. Потому что я использую подход TDD для разработки. TDD помогает избежать ошибок и ошибок при внедрении новых функций в приложение.
3. Я имею в виду, что, если бы вы сами написали конечную точку входа, было бы очень разумно написать тест для этого, но, поскольку вы пишете тест для конечной точки библиотеки, которая уже сильно протестирована, в чем необходимость?
4. Посмотрите на это, вы пытаетесь написать один и тот же тест, github.com/laravel/passport/blob/10.x/tests/Feature/…
5. Да, но я создал пользовательский маршрут «api/логин» для входа в систему, который использует этот маршрут по умолчанию для паспорта. Моя цель-протестировать маршрут «api/вход». Большое спасибо, что поделились этой ссылкой, я нашел решение.
Ответ №1:
На самом деле $client = Passport::client();
не возвращает клиента. Я нашел решение для создания клиента из LoginTest.
$user = User::factory()->create([
'email' => $email = 'test@test.com',
'password' => $password = '12345678'
]);
$client = ClientFactory::new()->asPasswordClient()->create(['user_id' => $user->id]);
$response = $this->json(
'POST', '/oauth/token',
[
'grant_type' => 'password',
'client_id' => $client->id,
'client_secret' => $client->secret,
'username' => $user->email,
'password' => $password,
]
)
->assertStatus(200);