标准答案

  1. 优先测试用户能看到的文本、按钮状态、表单提示、列表变化和错误反馈。
  2. 交互测试要模拟真实用户行为,例如点击、输入、键盘操作和提交。
  3. 异步组件要测试 loading、成功、失败和重试等关键状态。
  4. 不应该直接断言内部 useState 值、私有函数调用顺序或组件内部 DOM 层级。
  5. 测试用例应覆盖高风险业务路径,而不是为每一行 JSX 写快照。

题目解析

这道题和 Testing Library 理念一致。测试越贴近用户行为,重构组件实现时越不容易误报。

组件测试不是 E2E 测试,通常不需要覆盖完整跨页面链路。

对于复杂表单、权限按钮、错误态和异步请求,组件测试能提供很高的回归收益。

代码示例

下面测试提交失败后页面出现字段错误,而不是检查内部错误对象。

TSX
it('shows email error after submit', async () => {
  render(<SignupForm />)

  await userEvent.type(screen.getByLabelText('邮箱'), 'bad-email')
  await userEvent.click(screen.getByRole('button', { name: '注册' }))

  expect(screen.getByText('邮箱格式不正确')).toBeInTheDocument()
})

常见误区

  • 大量依赖 snapshot,组件稍微调整结构就产生无意义 diff。
  • 直接测试内部函数和 state,导致实现重构时测试大量失败。
  • 只测成功路径,不测 loading、失败、空数据和权限禁用状态。

作者信息