Vitest + RTL Vitest + RTL 测试

最后更新:2026-10-28

Vitest + RTL Vitest + RTL 测试

Vitest 是跑得飞快的测试运行器(与 Vite 共用配置),React Testing Library 让你「像用户一样」测组件:render 挂载、getByRole 查询、userEvent 模拟交互,断言行为而非实现细节。

分组数据与工程化
类型工具链
引入版本Vitest 2.x + RTL 16

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import Counter from './Counter'

describe('Counter', () => {
  it('点击后数字 +1', async () => {
    render(<Counter />)
    expect(screen.getByRole('status')).toHaveTextContent('0')
    await userEvent.click(screen.getByRole('button', { name: '+1' }))
    expect(screen.getByRole('status')).toHaveTextContent('1')
  })
})

返回值:describe/it 组织用例;render 挂载组件并返回查询句柄;screen.getByRole 等按语义查询元素;expect 断言结果。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

上方 Counter 随按钮变化;下方用例面板逐个亮起 ✅——对应 RTL 里 getByRole 查询 + expect 断言通过的过程(模拟演示)。

💡 要点

💡 提示 优先用 getByRole/ByLabelText 这类语义查询:既是测试又顺手检查了可访问性,比 getByTestId 更贴近用户视角。
ℹ️ 说明 Vitest 与 Vite 共用配置与转换管道,速度远快于 Jest;从 Jest 迁移通常只需改 import 来源。
⚠️ 注意 不要断言内部 state 或实现细节,重构会把测试全弄红;测「用户能看到什么、点什么出什么」。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q RTL 和 Enzyme 的思路差别?
A Enzyme 常直接探内部 state/props(实现细节),RTL 只从渲染结果按用户视角查询交互,测试更耐重构,也是官方推荐。
Q 异步操作(接口后渲染)怎么测?
A 用 findByRole 等 findBy* 查询(内置 waitFor 轮询),配合 msw 拦截网络请求,返回可控的假数据。
Q Vitest 怎么测自定义 Hook?
A 用 @testing-library/react 的 renderHook,result.current 读取最新返回值,rerender 触发更新后断言。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏