使用 Vue Test Utils

Flying
2018-06-19 / 0 评论 / 171 阅读 / 正在检测是否收录...

前面介绍过使用 Vue CLI 单元测试。如果你读过这篇文章,你会深深感觉到使用 Vue CLI 写单元测试不是很方便,比如测试事件时不得不派发自定义事件。另一方面,Jest 对 React 测试的支持在好很多,老早就可以使用专有的 API 处理事件了,谁让它们都有一个 Facebook 亲爹呢。技术是进步的,一天在 Vue 官网瞎逛,偶然它们发现已经推出了 Vue Test Utils,虽然只是 vuev1.0.0-beta.19,但也提供了强大的 API,写单元测试就更溜了。赶紧 Git 下来试一下。

vue-test-utils.svg

Vue Test Utils 是 Vue.js 官方的单元测试实用工具库。Vue 单文件组件在它们运行于 Node.js 或浏览器之前是需要预编译的。对于 Node.js 环境推荐通过 Jest 预编译器完成编译,对于浏览器推荐直接使用 Webpack 编译。

一、安装 Jest

假定我们通过 Vue CLI 创建了 webpack-simple 模板脚手架。接下来安装 jestvue-jestVue Test Utils

npm install --save-dev jest  babel-jest vue-jest @vue/test-utils

二、配置 package.json

1、我们在 package.json` 中定义一个单元测试的脚本。

// package.json
{
  "scripts": {
    "test": "jest"
  }
}

2、在 package.json 中配置 Jest:

"moduleFileExtensions": [
  "js",
  "json",
  "vue"
],
"moduleNameMapper": {
  "^@/(.*)$": "<rootDir>/src/$1"
},
"transform": {
  "^.+\\.js$": "<rootDir>/Node.js_modules/babel-jest",
  ".*\\.(vue)$": "vue-jest"
},
"testURL": "http://localhost",
"collectCoverage": true,
"collectCoverageFrom": [
  "src/components/*.{js,vue}",
  "!**/Node.js_modules/**"
],
"coverageReporters": [
  "html",
  "text-summary"
]

三、配置 babel

配置如下 .babelrc 文件示例:

{
  "presets": [["env", { "modules": false }]],
  "env": {
    "test": {
      "presets": [["env", { "targets": { "Node.js": "current" } }]]
    }
  }
}

为了仅在测试时应用这些选项,可以把它们放到一个独立的 env.test 配置项中 (这会被 babel-jest 自动获取)。

四、编写测试

重点来了,编写测试代码如下:

import { mount } from '@vue/test-utils'
import Counter from '@/components/Counter'

describe('Counter.vue', () => {
  const wrapper = mount(Counter)
  it('should render the correct tag', () => {
    expect(wrapper.html()).toContain('<span class="count">1</span>')
  })

  it('should have 2 buttons', () => {
    console.log(wrapper.findAll('button'))
    expect(wrapper.findAll('button')).toHaveLength(2)
  })

  it('count default value should be one', () => {
    expect(wrapper.vm.count).toBe(1)
  })

  it('should increment the count', () => {
    const button = wrapper.findAll('button').at(0)
    button.trigger('click')
    expect(wrapper.vm.count).toBe(2)
  })

  it('should decrement the count', () => {
    const button = wrapper.findAll('button').at(1)
    button.trigger('click')
    expect(wrapper.vm.count).toBe(1)
  })
})

有没有注意到,现在已经不用引入 Vue,因此也不依赖 Vue 组件的实例来创建测试用例。在 Vue Test Utils 中,通常会创建一个包含被挂载和渲染的 Vue 组件的包裹器。通过包裹器或包裹器数组的 API 来测试 Vue 组件。本实例中,我们用 findAll 替换了先前的 querySelectorAll,用 trigger 方法替代了派发自定义事件。使用工具本身的 API,是不是比原生的 DOM API 更优雅?

注意:本实例也设置了代码覆盖率,更多设置更多 API 用法请参考 Vue Test Utils 官方文档

最新的 vue cli3 已经内置 Vue Test Utils ,不需要手动配置,这样写 vue 测试就方便多了。感兴趣的话可以试一试。

✌️Happy Test!

6

评论 (0)

取消