关注

AI 生成前端 Mock 数据:先定义业务状态,再生成随机字段

AI 生成前端 Mock 数据:先定义业务状态,再生成随机字段

前端开发经常需要 Mock 数据。AI 生成一批 JSON 很容易,但真正好用的 Mock 不是字段看起来完整,而是能覆盖业务状态。空列表、加载中、权限不足、部分失败、超长文本、边界金额、异常日期,这些状态才是页面开发最容易漏掉的地方。

如果只让 AI 随机生成用户、订单、商品,界面会看起来很热闹,但测试不到真正危险的场景。Mock 数据要先服务状态覆盖,再服务数量。

一、先画状态矩阵

flowchart TD
  A[Feature Scenario] --> B[Normal]
  A --> C[Empty]
  A --> D[Loading]
  A --> E[Error]
  A --> F[Permission Denied]
  A --> G[Boundary Data]

做列表页时,不要只生成 20 条正常数据。至少要准备空数据、单条数据、超长数据、分页最后一页、接口错误和权限不足。

在做订单列表页时,我们梳理过一份完整的状态矩阵。除了正常态,至少还需要:

  • 空状态:新用户刚注册,没有任何订单
  • 单条数据:分页逻辑在只有一条记录时是否正确
  • 超长文本:收件人地址超过 100 字,UI 是否截断处理
  • 边界金额:0 元订单(礼品)、999999 元订单(大额商品)
  • 异常日期:1970 年的订单(时区问题)、未来的订单(数据错误)
  • 权限不足:普通成员看不到管理员的订单
  • 接口错误:网络断开、500 错误、超时

仅靠随机数据,这些场景大部分不会出现。AI 的随机生成倾向于生成"平均"样本,恰好在边界上掉链子。

为了验证这些状态,我们给每个列表页维护一个状态文件:

// __mocks__/states/order-list-states.ts
export const orderStates = {
  normal: {
    data: generateOrders(20),
    total: 20,
    meta: { status: "ok" },
  },
  empty: {
    data: [],
    total: 0,
    meta: { status: "ok" },
  },
  single: {
    data: generateOrders(1),
    total: 1,
    meta: { status: "ok" },
  },
  error: {
    data: [],
    total: 0,
    meta: { status: "error", message: "网络异常,请稍后重试" },
  },
  permission: {
    data: [],
    total: 0,
    meta: { status: "permission_denied" },
  },
  longText: {
    data: generateOrders(3, { receiverName: "A".repeat(200) }),
    total: 3,
    meta: { status: "ok" },
  },
} as const;

开发时只要切一个常量名,就能覆盖六种状态。比每次手动改接口返回效率高得多。

二、Prompt 要描述业务状态

比起"生成 10 条订单数据",更好的输入是:

mock_request:
  entity: order
  states:
    - normal_paid
    - refunding
    - payment_timeout
    - long_receiver_name
    - missing_optional_note
  constraints:
    amount_cent: "0-999999"
    created_at: "within 90 days"

这样 AI 输出的数据会更贴近页面验证,而不是只生成看起来平均的样本。

在实际使用中,我们发现更好的做法是把状态定义和字段约束分开。状态定义告诉 AI"要覆盖什么场景",字段约束告诉 AI"数据长什么样"。

mock_request:
  entity: order
  scenarios:
    - paid_order:
        amount_cent: 9900
        status: paid
        note: null
    - zero_amount:
        amount_cent: 0
        status: paid
        note: "赠品订单"
    - timeout:
        amount_cent: 19900
        status: payment_timeout
        created_at: "1 hour ago"
    - large_refund:
        amount_cent: 999900
        status: refunding
        refund_amount: 500000
  field_rules:
    id: uuid
    amount_cent: 0..999999
    created_at: 2026-01-01..2026-07-01
    status: enum[paid, refunding, timeout, shipped]
    receiver_name: 2..50 chars, mixed Chinese/English

分离场景和规则后,AI 生成的每条数据都有明确的验证目的,而不是随机填坑。评审时对照场景清单逐项确认,更容易发现遗漏。

三、Mock 数据要可复现

随机数据如果每次都变,截图回归和调试会很痛苦。建议固定 seed 或把生成结果落到文件。

export const orderMocks = {
  normal: [...],
  empty: [],
  paymentTimeout: [...]
};

页面开发时可以直接切换状态,而不是临时改接口返回。可复现的 Mock,是前端工程效率的一部分。

对于使用 faker.js 或类似库的项目,可以用固定 seed 保证每次生成结果一致:

import { faker } from "@faker-js/faker";

// 固定 seed,保证每次生成相同数据
export function generateMockData(seed: number, count: number) {
  faker.seed(seed);
  return Array.from({ length: count }, (_, i) => ({
    id: faker.string.uuid(),
    name: faker.person.fullName(),
    amount: faker.number.int({ min: 0, max: 999999 }),
    createdAt: faker.date.past({ years: 1 }).toISOString(),
  }));
}

// 不同场景使用不同 seed
export const mocks = {
  normal: generateMockData(42, 20),
  timeout: generateMockData(99, 5),
};

这样做的好处是:截图对比永远是同一批数据,调试时可以反复重现同一个问题,团队成员拉取代码后看到的 Mock 数据完全一致。随机是为了覆盖多样性,固定 seed 是为了可复现。两者不矛盾。

四、不要让 Mock 掩盖契约问题

Mock 数据要和接口 schema 对齐。AI 生成字段时,容易把 createdAt 写成 createTime,或者把金额从分改成元。最好用 TypeScript 类型或 zod schema 校验。

const OrderSchema = z.object({
  id: z.string(),
  amountCent: z.number(),
  status: z.enum(['paid', 'refunding', 'timeout'])
});

如果 Mock 都过不了 schema,说明它不是开发资产,而是噪声。

还可以把 Mock 场景接到 Storybook 或组件预览里,让设计、测试和产品都能直接切换状态。

export const Timeout = {
  args: {
    orders: orderMocks.paymentTimeout
  }
};

这样评审时不需要手动改接口,也不用靠口头描述"如果这里很长会怎样"。状态能被看见,问题才更容易被发现。

我们在 CI 中加了一个简单的检查:所有 Mock 数据文件必须能被 zod schema 校验通过,否则构建失败。

// __tests__/mock-validation.test.ts
import { OrderSchema } from "@/schemas";
import { orderMocks } from "@/mocks/orders";

test("all mock data validates against schema", () => {
  for (const [scenario, orders] of Object.entries(orderMocks)) {
    for (const order of orders) {
      const result = OrderSchema.safeParse(order);
      if (!result.success) {
        throw new Error(
          `Mock scenario "${scenario}" has invalid data: ${result.error.message}`
        );
      }
    }
  }
});

这个测试跑在 PR 阶段,任何 Mock 数据变更如果和 schema 不匹配都会暴露。后端接口改了字段名,前端的 Mock 也会同步卡住,迫使团队更新。这是 Mock 数据工程化中最简单也最有效的一道防线。

五、总结

AI 生成前端 Mock 数据时,先定义业务状态矩阵,再生成字段内容。覆盖正常、空、错、权限、边界和长文本等场景,并用类型或 schema 校验。

Mock 数据不是越多越好,而是越能暴露界面问题越好。随机字段只能填满页面,状态覆盖才能提升质量。

AI 的价值是快速生成候选数据,但前端要负责定义状态标准。标准在前,生成在后,Mock 才会稳定地服务研发流程。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_49475940/article/details/162549253

文章来源crawl

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--