# 测试前的准备
使用 Vitest 作为测试框架
- 安装 Vitest 和模拟 Web 浏览器的 jsdom 库
| npm install --save-vitest vitest jsdom |
- 还需要另一个测试库来帮助我们渲染组件进行测试。
react-testing-library
| npm install --save-dev @testing-library/react @testing-library/jest-dom |
- 在
package.json
中添加一个脚本来运行测试
| { |
| "scripts": { |
| |
| "test": "vitest run" |
| } |
| |
| } |
- 在项目根目录创建一个名为
testSetup.js
的内容
该函数重置了模拟浏览器的 jsdom
| import { afterEach } from 'vitest' |
| import { cleanup } from '@testing-library/react' |
| import '@testing-library/jest-dom/vitest' |
| |
| afterEach(() => { |
| cleanup() |
| }) |
- 在
vite.config.js
中添加一个 test
配置
| export default defineConfig({ |
| |
| test: { |
| environment: 'jsdom', |
| globals: true, |
| setupFiles: './testSetup.js', |
| } |
| }) |
- 安装 user-event 来模拟用户行为
| npm install --save-dev @testing-library/user-event |
# 测试组件
在对应目录下创建 .test.js
文件,并使用 describe
和 test
来编写测试用例。
这里采用我的博客进行测试
| import { render, screen } from '@testing-library/react' |
| import Blog from './Blog' |
| import { beforeAll, describe, expect } from 'vitest' |
| import userEvent from '@testing-library/user-event' |
| |
| describe('<Blog />', () => { |
| let container; |
| const blog = { |
| title: 'Test blog', |
| author: 'Test author', |
| url: 'www.test.com', |
| likes: 0, |
| } |
| |
| beforeEach(() => { |
| container = render( |
| <Blog blog={blog}> |
| |
| </Blog> |
| ).container |
| }) |
| |
| test('when the button is clicked, then the event handler is called once', async () => { |
| const user = userEvent.setup() |
| const button = screen.getByText('view') |
| await user.click(button) |
| |
| const div = container.querySelector('.blogDetails') |
| expect(div).not.toHaveStyle('display: none') |
| }) |
| test('when the button is clicked, then the event handler is called once', async () => { |
| const user = userEvent.setup() |
| const button = screen.getByText('view') |
| await user.click(button) |
| |
| expect(screen.findByText('url: ')).toBeDefined() |
| expect(screen.findByText('likes: ')).toBeDefined() |
| }) |
| }) |
# 检查代码的覆盖率
- 在
vitest.config.js
中添加一个 coverage
配置
| |
| import { defineConfig } from 'vitest/config' |
| |
| export default defineConfig({ |
| test: { |
| coverage: { |
| provider: 'v8' |
| } |
| } |
| }) |
- 安装覆盖所需依赖
| npm install -D @vitest/coverage-v8 |
- 跟新
package.json
的 scripts
| "scripts": { |
| "test": "vitest", |
| "coverage": "vitest run --coverage" |
| } |
- 运行
npm run coverage