Laravel 8测试JsonResponse::getSession不存在及会话数据获取问题
问题解决方法
Laravel 8 中 JsonResponse 本身不绑定会话实例,你调用的dumpSession()是测试响应类TestResponse提供的专用方法,它的底层实现是直接从应用容器中解析会话实例输出,并非读取响应对象自身的属性,这就是为什么你能看到会话数据但调用getSession()会报错的原因。
具体解决步骤
第一步:确认路由会话配置
Laravel 默认的api中间件组未启用StartSession中间件,如果你需要在api路由中使用会话,需要给对应路由单独注册该中间件:// 在routes/api.php中为指定路由添加中间件 Route::post('/your-endpoint', [YourController::class, 'method'])->middleware(\Illuminate\Session\Middleware\StartSession::class);第二步:正确获取会话数据
不需要从响应对象中读取,直接从测试环境的应用容器中解析会话实例即可,请求完成后容器中的会话已经是更新后的最新数据:// 发送接口请求 $response = $this->postJson('/api/your-endpoint', $requestData); // 直接从容器获取最新会话数据 $allSession = app('session')->all(); $targetValue = app('session')->get('your_session_key'); // 后续请求如果需要沿用当前会话,同一测试方法内不需要额外传值,Laravel测试客户端会默认复用同一会话实例,需要自定义传值可以用withSession方法 $nextResponse = $this->withSession(['custom_key' => $targetValue])->postJson('/api/next-endpoint', $nextData);
注意:如果只是需要验证会话数据是否符合预期,可以直接用Laravel测试自带的断言方法$response->assertSessionHas('key', 'expected_value'),不需要手动读取会话做判断。
内容的提问来源于stack exchange,提问作者Oli Soproni B.
相关产品推荐
相关产品推荐

