所以我想对API端点进行单元测试。 我正在使用Laravel 5.8,并且通过Passport完成了api身份验证 我有以下测试:
public function guest_can_login()
{
$user = factory(User::class)->create();
$response = $this->json('POST', 'api/login', [
'email' => $user->email,
'password' => 'secret',
]);
$response
->assertStatus(200)
->assertJson([
'success' => true,
]);
}
当我使用Postman执行请求时,它可以很好地工作,可以对用户进行身份验证并返回令牌,但是当我启动测试时,它会失败,并显示错误消息(“预期状态码为200,但收到了500。”)
所以我在响应中进行了更深入的搜索,发现了这一点:
“消息”:“未找到个人访问客户端。请创建一个。”
不知道为什么会这样,如果有人对此有所了解
编辑:已修复,请参见下面的最后一个答案
答案 0 :(得分:2)
如果您正在使用刷新数据库特征
public function setUp(){
parent::setUp();
\Artisan::call('passport:install');
}
答案 1 :(得分:0)
您看到此错误是因为尚未创建任何护照客户端。首先,请确保您已正确安装护照。然后在项目的根目录中运行以下命令以创建access client
;
php artisan passport:install
答案 2 :(得分:0)
只是为了向遇到相同问题的人说清楚,问题是我使用内存数据库进行测试这一事实,每次运行测试时它都会重置,因此当然也擦除了护照密钥,为什么在测试开始时添加\Artisan::call('passport:install');
可以解决此问题。
答案 3 :(得分:0)
\Artisan::call('passport:install');
这解决了问题
答案 4 :(得分:0)
这就是我写我的设置的方式......它曾经可以在没有护照哈希的情况下工作,现在经过哈希处理它不起作用......有人知道为什么吗?那就太酷了……
public function setUp(): void
{
parent::setUp();
Route::get('/test-route', function (Request $request) {
return $request->user();
})->middleware('auth:api');
$clientRepository = new ClientRepository();
$personal_access_client = $clientRepository->createPersonalAccessClient(
null,
'Personal Access Client Test',
'/'
);
DB::table('oauth_personal_access_clients')->insert([
'client_id' => $personal_access_client->id,
'created_at' => date('Y-m-d'),
'updated_at' => date('Y-m-d'),
]);
}