在 React.js 中做单元测试,通常会结合 测试运行器(Test Runner)、测试框架(Testing Framework) 和 React 测试工具。下面我按「主流方案 + 实战示例」给你一个清晰、可落地的指南。
✅ 最推荐组合:
不推荐再用 Enzyme(已停止维护)
npm install -D jest @testing-library/react @testing-library/jest-dom @testing-library/user-event jsdom
如果是 Vite 项目:
npm install -D vitest @testing-library/react jsdom
export default {
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['@testing-library/jest-dom'],
}
Button.jsxexport default function Button({ onClick, children }) {
return <button onClick={onClick}>{children}</button>
}
Button.test.jsximport { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import Button from './Button'
test('按钮能正确渲染并触发点击', async () => {
const handleClick = jest.fn()
render(<Button onClick={handleClick}>点击我</Button>)
const btn = screen.getByText('点击我')
expect(btn).toBeInTheDocument()
await userEvent.click(btn)
expect(handleClick).toHaveBeenCalledTimes(1)
})
test('显示传入文本', () => {
render(<Button>提交</Button>)
expect(screen.getByText('提交')).toBeInTheDocument()
})
function Counter() {
const [count, setCount] = React.useState(0)
return <button onClick={() => setCount(c => c + 1)}>{count}</button>
}
test('计数器加一', async () => {
render(<Counter />)
await userEvent.click(screen.getByText('0'))
expect(screen.getByText('1')).toBeInTheDocument()
})
test('加载后显示数据', async () => {
render(<UserProfile />)
expect(screen.getByText('加载中...')).toBeInTheDocument()
expect(await screen.findByText('用户名')).toBeInTheDocument()
})
jest.mock('./api', () => ({
fetchUser: jest.fn(() => Promise.resolve({ name: 'Tom' }))
}))
✅ 测试行为,不测试实现
✅ 像用户一样测试
npm test
npm test -- --coverage
如果你愿意,可以告诉我:
我可以直接给你匹配你项目的测试模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。