我正在尝试测试我的 API 身份验证方法,因此我创建了 ConfirmPasswordControllerTest :
/** @test */
public function confirm_password_confirms()
{
$user = factory(User::class)->create();
$data = ['password' => 'password'];
$response = $this->actingAs($user)
->post('api/password-confirmation', $data);
dd($response);
$response->assertStatus(200);
}
我使用 dd() 检查响应中的错误消息,我一直看到:
RuntimeException: Session store not set on request.
我不明白这里发生了什么,我使用的是 Laravel Sanctum,所以我的 api 路由有 auth:sanctum 中间件。
编辑:如果我在帖子中不包含任何数据,例如:
$response = $this->postJson('api/password-confirmation');
测试按预期运行:
{"message":"The given data was invalid.","errors":{"password":["The password field is required."]}}
编辑 2:我调试应用程序,我发现问题出在 PasswordConfirmController 上:
public function confirm(Request $request)
{
$request->validate($this->rules(), $this->validationErrorMessages());
$this->resetPasswordConfirmationTimeout($request); //HERE
return $request->wantsJson()
? new Response('', 204)
: redirect()->intended($this->redirectPath());
}
它调用 resetPasswordConfirmationTimeout() 并且此方法需要使用会话:
protected function resetPasswordConfirmationTimeout(Request $request)
{
$request->session()->put('auth.password_confirmed_at', time());
}