关于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 相关文章推荐
Jquery下attr和removeAttr的使用方法
Dec 28 Javascript
javascript中的对象创建 实例附注释
Feb 08 Javascript
Javascript基础知识(二)事件
Sep 29 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
Nov 17 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
Javascript 实现放大镜效果实例详解
Dec 03 Javascript
Bootstrap模态窗口源码解析
Feb 08 Javascript
js实现京东轮播图效果
Jun 30 Javascript
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
Vue from-validate 表单验证的示例代码
Sep 26 Javascript
Node.js事件的正确使用方法
Apr 05 Javascript
vue 如何使用递归组件
Oct 23 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php中unserialize返回false的解决方法
2014/09/22 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
JavaScript的目的分析
2007/01/05 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
JQuery实现Ajax加载图片的方法
2015/12/24 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
讲解Python中的标识运算符
2015/05/14 Python
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Python多线程实现同步的四种方式
2017/05/02 Python
机器学习python实战之决策树
2017/11/01 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
python中pip的安装与使用教程
2018/08/10 Python
详解python做UI界面的方法
2019/02/27 Python
python sorted方法和列表使用解析
2019/11/18 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
应聘自荐书
2013/10/08 职场文书
简历中自我评价分享
2013/10/09 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
在Spring-Boot中如何使用@Value注解注入集合类
2021/08/02 Java/Android
Java 实现限流器处理Rest接口请求详解流程
2021/11/02 Java/Android
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS