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
官方文档:https://gearcase-ui.cn
Vue Cli 中使用 Karma / Chrome 执行样式相关单元测试的更多相关文章
- vue cli 中关于vue.config.js中chainWebpack的配置
Vue CLI 的官方文档上写:调整webpack配置最简单的方式就是在vue.config.js中的configureWebpack选项提供一个对象. Vue CLI 内部的 webpack 配置 ...
- vue cli中的env详解
前言 相信使用过 vueCli 开发项目的小伙伴有点郁闷,正常开发时会有三个接口环境(开发,测试,正式),但是 vueCli 只提供了两种 development,production(不包含 tes ...
- vue.cli 中使用 less 来写css样式
vue-cli 的webpack中已配置了less,但 package.json 中没有选项,为了方便开发中使用,需安装一下: 安装方式一: npm install less less-loader ...
- 在vue-cli生成的项目中使用karma+chrome进行单元测试
用vue-cli生成项目时,如果选择了单元测试,那么会采用karma+mocha作为单元测试框架,默认使用的浏览器是PhantomJs. Karma 是一个基于Node.js的JavaScript测试 ...
- Vue-axios 在vue cli中封装
common/post.js import axios from 'axios' // 引入axios import qs from 'qs' // 引入qs axios.defaults.baseU ...
- scss是什么?在vue.cli中的安装使用步骤是?有哪几大特性?
css的预编译: 使用步骤: 第一步:用npm下三个loader(sass-loader.css-loader.node-sass): 第二步:在build目录找到webpack.base.confi ...
- Vue CLI 是如何实现的 -- 终端命令行工具篇
Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供了终端命令行工具.零配置脚手架.插件体系.图形化管理界面等.本文暂且只分析项目初始化部分,也就是终端命令行工具的实现. 0. 用法 ...
- vue cli使用融云实现聊天
公司有个项目要实现一个聊天功能,需求如下图,略显随意 公司最终选择融云这个吊炸天的即时通信,文档详细的一匹,刚开始看文档感觉很详细实现起来也不麻烦,有很多开源的demo可以在线演示和下载 不过我们的项 ...
- 关于Vue.cli 脚手架环境中引入Bootstrap时,table表格样式缺失的解决办法
Vue+bootstrap不能正常使用table的样式 环境:下载官网的本地bootstrap包,然后在vue 的index.html引入bootstrap的css和js环境 问题描述:1. vue里 ...
随机推荐
- ARC与Toll-Free Bridging
arc模块与mrc模块的沟通. 相当于程序的混编处理. Toll-Free Briding保证了在程序中,可以方便和谐的使用Core Foundation类型的对象和Objective-C类型的对象. ...
- React 入门学习笔记1
摘自阮一峰:React入门实例教程,转载请注明出处. 一. 使用React的html模板 使用React, 我们需要加载3个库,react.js, react-dom.js, 和browser.js. ...
- 构建Vue开发环境
1.开发环境的准备工作 IDE 可以选择WebStom或者VisualStudio Code Node.js的安装 node + npm 调试环境 Google Chrome + Vue.js 2.什 ...
- MapReduce经典入门小案例
/** * 单词统计 * @author fengmingyue * */ public class WordCount { public static void main(String[] args ...
- SQLite加密方式 [转]
关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). ...
- 【vue】vue项目引入 Element-UI
根据vue项目的搭建教程,接下来记录下如何在Vue-cli创建的项目中引入Element-UI. 1.安装直接用命令 (推荐) npm install element-ui 2.直接在根目录下的pac ...
- ios开发UI篇—UIScrollView属性及其代理方法
一.UIScrollView是什么? 1.UIScrollView是滚动的view,UIView本身不能滚动,子类UIScrollview拓展了滚动方面的功能. 2.UIScrollView是所有滚动 ...
- Python中sys模块sys.argv取值并判断
#!usr/bin/env python # -*- coding: utf-8 -*- # Author:Sun Xiaolin import sys judgement = sys.argv[1] ...
- 批量分离SQL数据库语句
--sp_helpdb--查看可用数据库 declare @name sysname, @sql nvarchar(4000) DECLARE roy CURSOR FOR --排除不分离的数据库名就 ...
- struts2第三天——值栈
大致内容: ognl概述 ognl入门 值栈 一.OGNL概述 OGNL,全称为Object-Graph Navigation Language,对象图导航语言 它是一个功能强大的表达式语言,用来获取 ...