Vue Cli 中使用 Karma / Chrome 执行样式相关单元测试
在 gearcase
开源项目 中,我使用了 vue cli
的默认测试框架。因此和样式相关的东西,都无法进行测试。因为它并不类似于无头浏览器,而是存在于虚拟内存之中。
现状
在如下 button.spec.js
单元测试用例当中,关于 icon 默认的 order
的测试用例无法进行测试,因为它涉及到了样式。前面已经提到由于它处于虚拟内存之中。因此只要进行单元测试,就会出现以下报错。
// 样式相关的测试用例 it('icon 默认的 order 是 1', () => { const wrapper = mount(button, { propsdata: { icon: 'setting' } }) const vm = wrapper.vm const icon = vm.$el.queryselector('svg') expect(getcomputedstyle(icon).order).to.eq('1') })
在查看了 vue test utils
的文档之后。查询到有一个属性 attachtodocument: true,
可以设置,试着把元素放置到 dom
之中。
// 样式相关的测试用例 添加 attachtodocument: true 属性之后 it('icon 默认的 order 是 1', () => { const wrapper = mount(button, { attachtodocument: true, propsdata: { icon: 'setting' } }) const vm = wrapper.vm const icon = vm.$el.queryselector('svg') expect(getcomputedstyle(icon).order).to.eq('1') })
但我添加了之后,仍然无法通过测试。根本原因仍旧是没有使用 karma
打开浏览器进行测试。
解决过程
-
配置
package.json
在package.json
中添加依赖配置,如下图。
-
安装依赖
使用如下命令安装之前package.json
中添加的依赖。yarn add -d karma karma-chrome-launcher karma-mocha karma-sourcemap-loader karma-spec-reporter karma-webpack chai sinon sinon-chai
-
创建
karma.config.js
在vue cli 3
的官方文档 webpack 相关章节中,可以查询到vue cli 3
将webpack.config.js
藏到了一个地方,即/node_modules/@vue/cli-service/webpack.config.js
。所以将该路径地址拷贝到
require
之后,让karma
可以读取到webpack
的配置。var webpackconfig = require('@vue/cli-service/webpack.config.js') module.exports = function (config) { config.set({ frameworks: ['mocha'], files: [ 'tests/**/*.spec.js' ], preprocessors: { '**/*.spec.js': ['webpack', 'sourcemap'] }, webpack: webpackconfig, reporters: ['spec'], browsers: ['chromeheadless'] }) }
新的问题
在做完上述 3 个操作流程之后,运行
npx karma start
。又遇到了以下图片中的问题,测试无法进行。一直卡在这个地方。
新问题解决
后来仔细检查之后,发现 karma.config.js
文件名应该是 karma.conf.js
,由于 vue.config.js
文件名的缘故,我错误的认为 karma
的配置文件名也是这种命名规则,所以上述的那个卡住无法进行测试的问题是由于配置文件名称错误导致的。
对比
vue cli 3 自带测试框架
无法运行和样式相关的测试用例。因为它并不类似于无头浏览器,而是存在于虚拟内存之中。
这些和样式挂钩的测试用例属性,会被认为是 undefined
,因为对于 vue cli 3
自带测试框架而言,这些属性本身就是不存在的。因此无法进行测试。
karma 测试运行器
使用 karma
测试运行器之后,关于样式相关的测试用例可以正常进行运行。但也必须要添加前面提到的 attachtodocument: true,
属性将元素放置到 dom
之中。
后记
由于组件的样式相关属性也有单元测试的必要,所以我决定将 karma
测试运行器作为我的默认单元测试框架,因此还需要在 package.json
中设置 "test:unit": "karma start",
以便 travis-ci
进行线上持续集成。
关于 gearcase ui
gearcase ui
组件框架已更新维护到 0.2.15
版本,如果喜欢该开源项目,请不要吝惜您的 star
。
项目地址:https://github.com/evenyao/gearcase
官方文档: