vitest 是由 vite 提供支持的极速单元测试框架,VueTestUtils 是 Vue.js 的官方测试实用程序库,vitest 本身是不支持单元组件测试的,需要配合 test-utils 来完成组件单元测试,安装与基本 API 就不再赘述,学会阅读文档与查找资料是一个程序员的基本功
/* Component */
<template>
<div>
<div class="test-utils-value">值为:{{ num }}</div>
<button class="test-utils-button" @click="increment">测试按钮</button>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { Ref } from 'vue'
const num: Ref<number> = ref(1)
function increment() {
num.value++
}
</script>
// spec | test
import { describe, it, expect } from 'vitest'
import { shallowMount } from '@vue/test-utils'
import AddNum from '@/views/AddNum.vue'
describe('组件单元测试', () => {
it('test1', async () => {
const wrapper = shallowMount(AddNum)
const btn = '.test-utils-button'
const value = '.test-utils-value'
expect(wrapper.find(value).text()).toContain('值为:1')
await wrapper.find(btn).trigger('click')
expect(wrapper.find(value).text()).toBe('值为:2')
})
})
- demo 由一个组件和测试文件组成
- 组件的逻辑非常简单,按下按钮则数字+1,页面显示实时数字
- 测试代码中使用 test-utils 库的 shallowMount 方法浅渲染挂载组件(*:浅渲染只渲染当前组件,不会渲染它的子组件,从而避免在测试中与子组件的行为产生干扰)
- 组件通过 find 方法返回查找元素,再通过 text 方法返回元素的文本内容
- 然后使用 vitest 库的 expect 创建断言,toContain 是断言检查值是否在数组中,toBe 是断言基础对象是否相等
- trigger 是 test-utils 中触发 DOM 事件的方法,demo 中触发了点击事件,模拟用户按下了按钮的操作,按下按钮前后都断言了,会判断实际执行结果与预期结果是否一致,如果不一致则会抛出错误
- 如将
tobe('值为:2')
改为tobe('值为:3')
,就会提示哪一个测试文件中的哪一个测试用例失败,并展示错误的预期值和实际的执行结果
- Expected "值为:3"
+ Received "值为:2"
虽然这是一个非常简单 demo,但它还是有很多值得注意的知识点的
test
和bench
,它们会被收集为隐式套件的一部分,也可以用describe
在当前上下文定义一个新套件,作为一组相关的测试或嵌套套件it
是test
的别名,使用it
或test
都是可以的mount(Component, { shallow: true })
来浅渲染挂载组件,shallow 的默认值是 falsenexttick()
import { nextTick } from 'vue'
it('test1', async () => {
const wrapper = shallowMount(AddNum)
const btn = '.test-utils-button'
const value = '.test-utils-value'
expect(wrapper.find(value).text()).toContain('值为:1')
wrapper.find(btn).trigger('click')
await nexttick()
expect(wrapper.find(value).text()).toBe('值为:2')
})
因为这是很常见的一个问题,test-utils提供了一个快捷方式,可以直接在await后跟触发DOM的事件,省略掉
nexttick()
,即await wrapper.find(btn).trigger('click')
,如此一来我们断言的实际结果就是自增过后的数字,与预期结果相符,测试用例通过