You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel API测试中嵌套JSON的assertJsonStructure断言导致index与show接口测试无法同时通过

Laravel API测试中嵌套JSON的assertJsonStructure断言导致index与show接口测试无法同时通过

我之前在用PHPUnit测试书籍API的时候,碰到过一个挺闹心的问题——嵌套JSON的结构让index(列表)和show(详情)接口的测试没法同时跑通。当时我图省事,给两个测试用了完全一样的断言代码,结果只有index测试成功了,show测试直接抛了个错误:
PHPUnit\Framework\Assert::assertArrayHasKey(): Argument #2 ($array) must be of type ArrayAccess|array, int given

后来琢磨明白,问题出在两个接口的返回结构不一样:

  • index接口返回的是书籍列表,data字段是一个数组,里面每个元素都是单本书的对象;
  • show接口返回的是单本书详情,data字段就是单个书籍对象。

如果用同一段断言,比如按照数组结构来写,那show接口返回的单个对象就会被当成数组去解析,自然就触发类型错误了。

解决办法其实很简单,针对两个接口的不同结构分别写断言就行:

针对index(列表)接口的测试代码

$response->assertStatus(200)->assertJsonStructure([
    'success',
    'data' => [
        '*' => [ // 表示数组中的每一个元素都符合下面的结构
            'id',
            'title',
            'author' => [ // 嵌套的author对象结构
                'name',
                'email'
            ]
        ]
    ]
]);

针对show(详情)接口的测试代码

$response->assertStatus(200)->assertJsonStructure([
    'success',
    'data' => [ // 直接写单个对象的结构,不需要*通配符
        'id',
        'title',
        'author' => [
            'name',
            'email'
        ]
    ]
]);

核心就是区分清楚data是数组还是单个对象:用*通配符来匹配数组里的每一项,单个对象就直接写字段结构。这样两个测试就能各自跑通啦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:34:29