# 测试前的准备

使用 Vitest 作为测试框架

  1. 安装 Vitest 和模拟 Web 浏览器的 jsdom 库
npm install --save-vitest vitest jsdom
  1. 还需要另一个测试库来帮助我们渲染组件进行测试。 react-testing-library
npm install --save-dev @testing-library/react @testing-library/jest-dom
  1. package.json 中添加一个脚本来运行测试
{
  "scripts": {
    // ...
    "test": "vitest run"
  }
  // ...
}
  1. 在项目根目录创建一个名为 testSetup.js 的内容
    该函数重置了模拟浏览器的 jsdom
import { afterEach } from 'vitest'
import { cleanup } from '@testing-library/react'
import '@testing-library/jest-dom/vitest'
afterEach(() => {
  cleanup()
})
  1. vite.config.js 中添加一个 test 配置
export default defineConfig({
  // ...
  test: {
    environment: 'jsdom',
    globals: true,
    setupFiles: './testSetup.js', 
  }
})
  1. 安装 user-event 来模拟用户行为
npm install --save-dev @testing-library/user-event

# 测试组件

在对应目录下创建 .test.js 文件,并使用 describetest 来编写测试用例。
这里采用我的博客进行测试

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') // 获取 div
        expect(div).not.toHaveStyle('display: none') // 判断 div 是否隐藏
    })
    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()
    })
})

# 检查代码的覆盖率

  1. vitest.config.js 中添加一个 coverage 配置
// vitest.config.js
import { defineConfig } from 'vitest/config'
export default defineConfig({
  test: {
    coverage: {
      provider: 'v8' // 或 'istanbul'
    }
  }
})
  1. 安装覆盖所需依赖
npm install -D @vitest/coverage-v8
  1. 跟新 package.jsonscripts
"scripts": {
  "test": "vitest",
  "coverage": "vitest run --coverage"
}
  1. 运行 npm run coverage
更新于 阅读次数