Laravel分页接口测试:如何对data字段使用hasAll/missingAll断言
Laravel 分页JSON响应断言方案
你当前测试不生效的核心原因是:分页接口返回的外层是包含分页元信息的对象,实际作者列表数据存储在根节点的data字段下,你之前直接在根节点调用has(2)、first()方法,实际是在对根对象做断言,自然无法匹配到列表元素。
Illuminate\Testing\Fluent\AssertableJson 原生支持嵌套节点定位,不需要手动将响应转数组循环遍历,直接用路径语法即可实现你要的hasAll()、missingAll()断言。
正确实现代码
修正后的测试方法
/** * Test the Index Route of Author Controller. * * @return void */ public function test_index_route() { $response = $this->get('/api/authors'); $response->assertStatus(200); $response->assertSuccessful(); // 断言data节点下列表长度为2,替换原来错误的根节点计数 $response->assertJsonCount(2, 'data'); $response->assertJson( fn (AssertableJson $json) => $json->has('current_page') ->has('per_page') ->has('first_page_url') ->has('next_page_url') ->has('prev_page_url') // 定位到data节点,声明该节点下有2个元素,闭包内直接操作data节点 ->has('data', 2, function (AssertableJson $dataJson) { // 遍历data下所有作者元素,统一校验字段规则(比只校验first覆盖更全面) $dataJson->each(function (AssertableJson $itemJson) { $itemJson->hasAll(['id', 'name', 'description']) ->missingAll(['email', 'avatar', 'twitter', 'password', 'created_at', 'updated_at']); }); }) ); }
关键用法说明
has()方法支持传入节点路径作为第一个参数,使用点语法可以定位任意深度的嵌套节点,例如has('data.0.tags', 3)表示断言第一条作者数据下的tags字段有3个元素- 给
has()传入第三个闭包参数时,闭包接收的AssertableJson实例会自动切换到你指定的节点作用域,不需要额外做节点跳转 each()方法会遍历当前数组作用域下的所有元素执行断言,适合列表接口统一校验所有返回项的字段规则,比仅校验第一项的first()方法测试覆盖度更高assertJsonCount()接收第二个可选参数作为计数的节点路径,不传入时默认统计根节点下的元素数量,分页场景下必须指定data作为计数路径才能得到正确结果
内容的提问来源于stack exchange,提问作者The Devick
相关产品推荐
相关产品推荐

