Laravel 5.5返回JSON响应自动添加额外字段问题咨询
解决Laravel 5.5测试中JSON响应出现额外字段的问题
这个问题我之前在项目里碰到过,其实核心原因是你在测试时没有正确提取Laravel响应里的实际JSON内容,反而拿到了整个JsonResponse对象的内部结构。
为什么会出现这些额外字段?
当你在控制器里用return response()->json($return)时,Laravel返回的是一个Illuminate\Http\JsonResponse实例,这个对象包含了响应的所有元数据(比如headers、状态码)和你真正要返回的业务数据(存在original属性里)。如果你的测试代码直接输出或者断言这个对象本身,就会看到headers、original、exception这些内部字段,而不是你预期的纯净JSON。
另外你提到statusCode变成了字符串,这大概率是你构建$return数组时,把665写成了字符串类型(比如"665"),检查一下赋值代码改成整数即可。
正确的测试处理方式
下面是几种解决方法,任选其一都能拿到你预期的JSON数据:
1. 用Laravel测试自带的assertJson方法直接断言(最推荐)
Laravel的测试套件已经封装了专门的JSON断言方法,它会自动解析响应里的JSON内容,不用手动处理:
$response = $this->get('/your-api-endpoint'); // 直接断言响应的JSON内容符合预期 $response->assertJson([ 'statusCode' => 665, 'msg' => 'auth missing' ]);
2. 用json()方法获取解析后的数组
如果你需要单独处理返回的数据,可以调用响应对象的json()方法,它会把original里的JSON数据解析成关联数组:
$response = $this->get('/your-api-endpoint'); $data = $response->json(); // 现在$data就是你预期的数组:["statusCode" => 665, "msg" => "auth missing"] $this->assertEquals(665, $data['statusCode']); $this->assertEquals('auth missing', $data['msg']);
3. 获取原始JSON字符串再解码
如果需要操作原始的JSON字符串,可以用getContent()拿到字符串后手动解码:
$response = $this->get('/your-api-endpoint'); $jsonStr = $response->getContent(); $data = json_decode($jsonStr, true); // 第二个参数true返回关联数组 $this->assertEquals(665, $data['statusCode']);
内容的提问来源于stack exchange,提问作者Daniel Becker
相关产品推荐
相关产品推荐

