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
相关产品推荐
相关产品推荐

