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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:18:16