测试的学问很深,有很多种不同的测试类型:
在我们项目中,我们是代码的制造者,我们主要关注代码逻辑、组件渲染和交互,组件逻辑也非常清楚,因此我们只做单测,属于白盒测试。
Vitest
是Vue/Vite团队成员维护的单元测试框架,它可以使用和Vite同一个配置并且使用相同的转换流程,因此安装配置都非常快捷!
安装Vitest
yarn add -D vitest happy-dom @testing-library/vue
配置,vite.config.js
///
import { defineConfig } from 'vite'
export default defineConfig({
// ...
test: {
// enable jest-like global test APIs
globals: true,
// simulate DOM with happy-dom
// (requires installing happy-dom as a peer dependency)
environment: 'happy-dom',
// 支持tsx组件,很关键
transformMode: {
web: [/.[tj]sx$/]
}
}
})
`避免类型错误提示
ts配置添加类型
// tsconfig.json
{
"compileroptions": {
"types": ["vitest/globals"]
}
}
编写测试
// Test.test.ts
test('it should work', () => {
const { getByText } = render(Test, {
props: {
msg: 'hello'
}
})
// assert output
getByText('hello')
})
添加脚本
{
// ...
"scripts": {
"test": "vitest"
}
}
运行
> npm test
学会基本用法和原则之后,我们需要实战一下,下面我们给我们的Button组件编写几个单测练练手。
// button.test.ts
import { render } from '@testing-library/vue'
import Button from '../src/button'
// 基础按钮
test('it should work', () => {
const { getByRole } = render(Button)
getByRole('button')
})
// 插槽
test('default slot should be 按钮', () => {
const { getByText } = render(Button)
getByText('按钮')
})
test('default slot should work', () => {
const { getByText } = render(Button, {
slots: {
default() {
return 'button'
}
}
})
getByText('button')
})
// 按钮类型
test('default type should be secondary', () => {
// 默认secondary
const { getByRole } = render(Button)
const button = getByRole('button')
expect(button.classList.contains('s-btn--secondary')).toBe(true)
})
test('type should work', () => {
// 默认secondary
const { getByRole } = render(Button, {
props: {
type: 'primary'
}
})
const button = getByRole('button')
expect(button.classList.contains('s-btn--primary')).toBe(true)
})
运行单侧
yarn test