您的位置:

Vue Jest

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