使用Karma做vue组件单元测试的实现

2020-06-16 06:35:22易采站长站整理

详细的关于 @vue/test-utils 用法,查看 https://vue-test-utils.vuejs.org/zh/


import { expect } from 'chai'
import { shallowMount } from '@vue/test-utils'
import Header from '../src/components/Header'

describe('Header', () => {
const wrapper = shallowMount(Header)
const header = wrapper.find('header')
const h1 = wrapper.find('h1')

it('有 header 标签', () => {
expect(header.exists()).to.be.true
})

it('有 h1 标签', () => {
expect(h1.exists()).to.be.true
})

it('h1 的文案为“VUE 单页模版”', () => {
expect(h1.text()).to.equal('VUE 单页模版')
})

it('h1 标签在 header 标签中', () => {
expect(header.contains('h1')).to.be.true
})
})

这里我引用 vue-single-page 的 Header 组件测试用例

首先通过 shallowMount 获取 wrapper
使用 chai 断言库编写相关的测试用例

运行结果

i 「wdm」: Compiled successfully.
15 01 2020 18:28:13.799:INFO [karma-server]: Karma v4.4.1 server started at http://0.0.0.0:9876/
15 01 2020 18:28:13.813:INFO [launcher]: Launching browsers Chrome with concurrency unlimited
15 01 2020 18:28:13.820:INFO [launcher]: Starting browser Chrome
15 01 2020 18:28:17.075:INFO [Chrome 79.0.3945 (Windows 10.0.0)]: Connected on socket PUKPz4iBuFzeVNSsAAAA with id 91716917
TOTAL: 4 SUCCESS

可以看到我们的单元测试已经通过了

测试覆盖率报告

测试完成后,我们需要查看测试覆盖率报告。这需要在 webpack.test.config.js 和 karma.conf.js 中做一些配置修改

webpack.test.config.js


const merge = require('webpack-merge')
const path = require('path')
const webpackCommonConfig = require('./webpack.common.config')

const testConfig = {
devtool: 'inline-source-map',
mode: 'none',
module: {
rules: [
{
test: /.spec.js$/i,
enforce: 'pre',
use: [
{
loader: 'istanbul-instrumenter-loader',
options: {
esModules: true
}
}
] }
] }
}

module.exports = merge(webpackCommonConfig, testConfig)

添加一个优先执行的编译 .spec.js 文件的 rules,loader 使用 istanbul-instrumenter-loader 并开启 esModules 模式

karma.conf.js


module.exports = function(config) {
config.set({

// ...

coverageIstanbulReporter: {
reports: [ 'html', 'text' ],
fixWebpackSourcePaths: true
},

reporters: [ 'coverage-istanbul' ]

//...

})
}

设置 reporters 为 [ ‘coverage-istanbul’ ],即使用 coverage-istanbul reporters