详解Vue单元测试Karma+Mocha学习笔记
在使用vue-cli创建项目的时候,会提示要不要安装单元测试和e2e测试。既然官方推荐我们使用这两个测试框架,那么我们就动手去学习实践一下他们吧。 简介KarmaKarma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner)。该工具在Vue中的主要作用是将项目运行在各种主流Web浏览器进行测试。 换句话说,它是一个测试工具,能让你的代码在浏览器环境下测试。需要它的原因在于,你的代码可能是设计在浏览器端执行的,在node环境下测试可能有些bug暴露不出来;另外,浏览器有兼容问题,karma提供了手段让你的代码自动在多个浏览器(chrome,firefox,ie等)环境下运行。如果你的代码只会运行在node端,那么你不需要用karma。 MochaMocha是一个测试框架,在vue-cli中配合chai断言库实现单元测试。 而Chai断言库可以看,很简单,多查多用就能很快掌握。 我对测试框架的理解npm run unit 执行过程
Karma对于Karma,我只是了解了一下它的。 下面是Vue的karma配置,简单注释了下: module.exports = function (config) {
config.set({ // 浏览器 browsers: ['PhantomJS'],// 测试框架 frameworks: ['mocha','sinon-chai','phantomjs-shim'],// 测试报告 reporters: ['spec','coverage'],// 测试入口文件 files: ['./index.js'],// 预处理器 karma-webpack preprocessors: { './index.js': ['webpack','sourcemap'] },// Webpack配置 webpack: webpackConfig,// Webpack中间件 webpackMiddleware: { noInfo: true },// 测试覆盖率报告 // https://github.com/karma-runner/karma-coverage/blob/master/docs/configuration.md coverageReporter: { dir: './coverage',reporters: [ { type: 'lcov',subdir: '.' },{ type: 'text-summary' } ] } }) } Mocha和chai我们看下官方的例子(都用注释来解释代码意思了): {
// 每个describe块应该包括一个或多个it块,称为测试用例(test case)
it('should render correct contents',() => {
const Constructor = Vue.extend(Hello) // 获得Hello组件实例
const vm = new Constructor().$mount() // 将组件挂在到DOM上
//断言:DOM中class为hello的元素中的h1元素的文本内容为Welcome to Your Vue.js App
expect(vm.$el.querySelector('.hello h1').textContent)
.to.equal('Welcome to Your Vue.js App')
})
})
需要知道的知识点:
{
request
.get('https://api.github.com')
.end(function(err,res){
expect(res).to.be.an('object');
done();
});
});
了解一下 describe 的钩子(生命周期) before(function() {
// 在本区块的所有测试用例之前执行 }); after(function() { beforeEach(function() { afterEach(function() { // test cases 实践上面简单介绍了单元测试的用法,下面来动手在Vue中进行单元测试! util.js从Vue官方的demo可以看出,对于Vue的单元测试我们需要将组件实例化为一个Vue实例,有时还需要挂载到DOM上。 以上写法只是简单的获取组件,有时候我们需要传递props属性、自定义方法等,还有可能我们需要用到第三方UI框架。所以以上写法非常麻烦。 这里推荐Element的,它封装了Vue单元测试中常用的方法。下面demo也是根据该 Util.js来写的。 这里简单注释了下各方法的用途。 /**
/**
/**
/**
示例一示例一中我们测试了 Hello 组件的各种元素的数据,学习 util.js 的 destroyVM 和 createTest 方法的用法以及如何获取目标元素进行测试。获取DOM元素的方式可查看。 Hello.vue Hello.spec.js describe('Hello.vue',() => {
let vm afterEach(() => { it('测试获取元素内容',() => { it('测试获取Vue对象中数据',true) it('测试获取DOM中是否存在某个class',true) 输出结果
示例二示例二中我们使用 createTest 创建测试组件测试点击事件,用 createVue 创建Vue示例对象测试组件 Click 的使用。这里主要可以看下到 createVue 方法的使用。 Click.vue Click.spec.js describe('click.vue',() => {
let vm afterEach(() => { it('测试按钮点击事件',() => { it('测试创建Vue对象',() => { 输出结果
其他所有示例代码都放中便于查看。如果想查看更多好的测试用例,建议配合 Util.js 看一下 ,里面有很多测试脚本可以供我们学习。作为被广大Vue用户使用的UI组件库,测试脚本肯定也写很很不错的~甚至可以将这些脚本照抄一遍,相信这会对学习Vue组件的单元测试有很大帮助。 下面是本人看Element单元测试的笔记,供参考。 Util.js 方法包含了大多数Vue组件化的测试需求。 vm.$el vm.$nextTick 和 vm.$ref 都是在测试过程中比较常用的一些Vue语法糖。 需要注意: vm.$nextTick 方法是异步的,所以需要在里面使用done方法。 异步断言,方法参数需要是 _ 或者 done 大多数时候查询元素通过 querySelector 方法查询class获得 大多数情况下查询是否存在某个Class通过 classList.contains 方法获得,查找的结果为 true 或 false 异步测试必须以 done() 方法结尾。setTimeout 和 vm.$nextTick 是常用的异步测试。 实现按钮点击:通过获取按钮元素 btn,执行 btn.click() 方法实现。 由于 Vue 进行的情况,一些依赖DOM更新结果的断言必须在 Vue.nextTick 回调中进行。 {
vm.$refs.cascader.$el.querySelector('.el-cascader__clearIcon').click();
vm.$nextTick(_ => {
expect(vm.selectedOptions.length).to.be.equal(0);
done();
});
});
Vue.js学习系列项目地址: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |