Vue Jest 是一个测试框架,用于为 Vue 应用程序编写单元测试和集成测试。在本文中,我将从多个方面详细介绍 Vue Jest 的用途、功能和用法。
一、安装和配置
Vue Jest 的使用前必须安装,使用 npm 或者 yarn:
npm i -D jest @vue/test-utils vue-jest babel-jest jest-serializer-vue
在 package.json 中添加:
"scripts": {
"test": "jest"
},
"jest": {
"preset": "@vue/cli-plugin-unit-jest/presets/typescript-and-babel",
"transform": {
"^.+\\.vue$": "vue-jest",
".+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$": "jest-transform-stub",
"^.+\\.js$": "babel-jest"
}
}
这里的 preset 需要根据实际项目进行配置,包括语言、框架等。
二、单元测试和集成测试
Vue Jest 可以用于编写单元测试和集成测试。下面是一个 Vue 组件的示例代码和相应的测试代码。
Vue 组件代码:
<template>
<div>
<p>{{ message }}</p>
<button @click="onClick">Increment</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
},
computed: {
message() {
return `Count: ${this.count}`
}
},
methods: {
onClick() {
this.count++
}
}
}
</script>
接下来是这个组件的单元测试:
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
describe('MyComponent', () => {
it('renders message when count is 0', () => {
const wrapper = shallowMount(MyComponent)
expect(wrapper.text()).toMatch('Count: 0')
})
it('renders message when count is incremented', async () => {
const wrapper = shallowMount(MyComponent)
await wrapper.find('button').trigger('click')
expect(wrapper.text()).toMatch('Count: 1')
})
})
除了单元测试,Vue Jest 也支持集成测试。下面是一个集成测试的示例代码,用于测试整个应用程序的行为。
import { mount } from '@vue/test-utils'
import App from '@/App.vue'
describe('App', () => {
it('increments count when button is clicked', async () => {
const wrapper = mount(App)
await wrapper.find('button').trigger('click')
expect(wrapper.vm.count).toBe(1)
})
})
三、mock 和 spy
Vue Jest 还支持 mock 和 spy 的功能。这对于测试一些与接口等外部依赖有关的逻辑非常有用。
下面是一个 mock 的示例代码,用于模拟一个返回固定数据的接口:
import { shallowMount } from '@vue/test-utils'
import axios from 'axios'
import MyComponent from '@/components/MyComponent.vue'
jest.mock('axios')
describe('MyComponent', () => {
it('displays data from API', async () => {
const data = {
message: 'Hello World!'
}
axios.get.mockResolvedValue(data)
const wrapper = shallowMount(MyComponent)
await wrapper.vm.loadData()
expect(wrapper.text()).toMatch(data.message)
})
})
And here's a spy example, which monitors how a certain method is called:
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
describe('MyComponent', () => {
it('calls method when button is clicked', async () => {
const wrapper = mount(MyComponent)
const onClickSpy = jest.spyOn(wrapper.vm, 'onClick')
await wrapper.find('button').trigger('click')
expect(onClickSpy).toHaveBeenCalled()
})
})
四、总结
本文介绍了 Vue Jest 的安装、配置、单元测试和集成测试,以及 mock 和 spy 的功能。Vue Jest 是一个强大的测试框架,可以为 Vue 应用程序提供全面的测试支持。
完整代码请访问Github。