关于Vue Webpack2单元测试示例详解


Posted in Javascript onAugust 14, 2017

前言

最近发现一个问题,vue-cli 提供的官方模板确实好用。但一直用下来手贱毛病又犯了,像穿了别人的内衣,总感觉不舒服。

所以有机会就瞎倒腾了一遍,总算把各个流程摸了一把。这里分享一下配置带覆盖率的单元测试。分享出来供大家参考学习,话不多少了,来一起看看详细的介绍:

一、文件结构

基本的文件结构。

├─src
│ ├─assets
│ ├─components
│ ├─app.vue
│ └─main.js
├─test
│ └─unit
│  ├─coverage
│  ├─specs
│  ├─index.js
│  └─karma.conf.js
├─.babelirc
├─webpack.conf.js
└─package.json

二、依赖

根据需要增删

yarn add -D \
cross-env \
# webpack
webpack \
webpack-merge \
vue-loader \
# babel
babel-core \
babel-loader \
babel-plugin-transform-runtime \
babel-preset-es2015 \
babel-register \
babel-plugin-istanbul \
# karma
karma \
karma-coverage \
karma-phantomjs-launcher \
karma-sourcemap-loader \
karma-spec-reporter \
karma-webpack \
mocha \
karma-mocha \
sinon-chai \
karma-sinon-chai \
chai \
sinon \

三、入口

先从 package.json 开始。跟官方的一致。设置 BABEL_ENV 可以在测试的时候才让 Babel 引入 istanbul 计算覆盖率。

{
 "scripts": {
 "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
 "test": "npm run unit",
 }
}

四、配置 Babel

在 .babelirc 中:

{
 "presets": ["es2015"],
 "plugins": ["transform-runtime"],
 "comments": false,
 "env": {
 "test": {
  "plugins": [ "istanbul" ]
 }
 }
}

按需设置,写 Chrome Extension 的话用 es2016 就行。

Babel 的 istanbul 插件是个很聪明的做法。

五、Loader 配置

从 Vue Loader 的文档可以看到,不需要额外配置,它非常贴心自动识别 Babel Loader。

如果还测试 js 文件那么给源文件夹下的 js 文件配置 Babel Loader 就行。

以 src 为例:

{
 module: {
 rules: [
  {
  test: /\.vue$/,
  loader: 'vue-loader'
  },
  {
  test: /\.js$/,
  loader: 'babel-loader',
  include: [
   path.resolve(__dirname, '../src')
  ],
  exclude: /node_modules/
  }
 ]
 }
}

六、Karma 配置

为 webpack 设置环境

// karma.conf.js
const merge = require('webpack-merge')
let webpackConfig = merge(require('../../webpack.conf'), {
 devtool: '#inline-source-map',
 plugins: [
 new webpack.DefinePlugin({
  'process.env': '"testing"'
 })
 ]
})
// no need for app entry during tests
delete webpackConfig.entry

接着输出 karma 配置,基本沿用官方的配置。注意不同的浏览器需要安装不同的 karma 插件。

// karma.conf.js
module.exports = function (config) {
 config.set({
 // to run in additional browsers:
 // 1. install corresponding karma launcher
 // http://karma-runner.github.io/0.13/config/browsers.html
 // 2. add it to the `browsers` array below.
 browsers: ['Chrome'],
 frameworks: ['mocha', 'sinon-chai'],
 reporters: ['spec', 'coverage'],
 files: ['./index.js'],
 preprocessors: {
  './index.js': ['webpack', 'sourcemap']
 },
 webpack: webpackConfig,
 webpackMiddleware: {
  noInfo: true
 },
 coverageReporter: {
  dir: './coverage',
  reporters: [
  { type: 'lcov', subdir: '.' },
  { type: 'text-summary' }
  ]
 }
 })
}

七、引入所有组件

在 test/unit/index.js 里,这是官方的配置:

// require all test files (files that ends with .spec.js)
const testsContext = require.context('./specs', true, /\.spec$/)
testsContext.keys().forEach(testsContext)
// require all src files except main.js for coverage.
// you can also change this to match only the subset of files that
// you want coverage for.
const srcContext = require.context('src', true, /^\.\/(?!main(\.js)?$)/)
srcContext.keys().forEach(srcContext)

因为之前配置 loader 时 src 文件夹下的 js 才会被收集计算覆盖率,所以可以放心 require 。

第二段 require 是为了所有源码一起算覆盖率。可以看到官方配置只排除了 src 目录里的 main.js,如果是多入口可以用 /^(?!.*\/main(\.js)?$)/i 排除所有的 main.js 文件。

八、开始测试

这基本上就是所有的配置了。其它的设置应该都是围绕插件本身,就不赘述。

九、Babeless 配置

如果不需要 Babel 可以用 istanbul-instrumenter-loader 收集覆盖率。

js 文件的配置同 Babel。

 Vue 文件需要在 options.loaders 选项里为 js 补上:

{
 test: /\.vue$/,
 loader: 'vue-loader',
 options: {
 loaders: {
  'js': 'istanbul-instrumenter-loader'
 }
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
showModelessDialog()使用详解
Sep 07 Javascript
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
jquery 最简单易用的表单验证插件
Feb 27 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
Nov 02 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
JavaScript设计模式之代理模式介绍
Dec 28 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
Javascript实现字数统计
Jul 03 Javascript
JS动画实现回调地狱promise的实例代码详解
Nov 08 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 Javascript
请求时token过期自动刷新token操作
Sep 11 Javascript
JavaScript数组 几个常用方法总结
Nov 11 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
Aug 14 #Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 #Javascript
JavaScript中的return布尔值的用法和原理解析
Aug 14 #Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 #Javascript
利用纯JS实现像素逐渐显示的方法示例
Aug 14 #Javascript
jQuery 实时保存页面动态添加的数据的示例
Aug 14 #jQuery
js异步编程小技巧详解
Aug 14 #Javascript
You might like
php curl 伪造IP来源的实例代码
2012/11/01 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
python通过ssh-powershell监控windows的方法
2015/06/02 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
Django ORM多对多查询方法(自定义第三张表&ManyToManyField)
2019/08/09 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
签约仪式主持词
2014/03/19 职场文书
财产保全担保书范文
2014/04/01 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
工程售后服务承诺书
2014/05/21 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年助理工程师工作总结
2015/04/03 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
SQL注入的实现以及防范示例详解
2021/06/02 MySQL