标准答案

  1. 单元测试通常直接构造函数输入,不需要启动后端或真实网络请求。
  2. 组件测试可以 mock service 层、API client 或使用 MSW 这类网络层拦截,保持组件交互接近真实。
  3. E2E 测试应使用专门测试环境、固定账号、种子数据和可重置状态,避免污染生产或依赖随机数据。
  4. Mock 数据要来自明确契约,例如 OpenAPI、类型定义、fixture 或测试工厂,避免和真实接口结构漂移。
  5. 关键接口仍需要契约测试或少量集成验证,防止 mock 一直通过但真实接口已经变了。

题目解析

Mock 的位置取决于测试想验证什么。如果只是验证价格计算,直接传入数据最简单;如果要验证组件收到接口返回后的 loading、成功、失败状态,mock API 层或网络层更合适。

测试依赖真实后端会带来不稳定:账号状态变了、网络抖动、数据被别人改了、接口限流或环境维护都会让测试失败。自动化测试需要可重复、可重置、可诊断。

但 mock 也不能脱离真实契约。fixture 长期没人维护,字段删了测试还绿,就是假安全。更稳的是用契约、类型、测试工厂和少量真实集成检查约束 mock。

代码示例

组件测试里可以用网络层 mock 同时覆盖成功和失败分支。

JavaScript
server.use(
  http.get('/api/user', () => {
    return HttpResponse.json({
      id: 'u_1',
      name: 'Luo'
    })
  })
)

常见误区

  • 自动化测试直接依赖生产或共享测试环境里的随机数据。
  • Mock 数据散落在测试里,接口字段变化后很难统一维护。
  • Mock 过度,完全不做契约或集成验证,真实接口坏了测试仍然通过。

作者信息