关于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 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
Apr 19 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
JS平滑无缝滚动效果的实现代码
May 06 Javascript
JavaScript 详解预编译原理
Jan 22 Javascript
Node.js之网络通讯模块实现浅析
Apr 01 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
vue动态禁用控件绑定disable的例子
Oct 28 Javascript
JavaScript将数组转换为链表的方法
Feb 16 Javascript
vue使用openlayers实现移动点动画
Sep 24 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加密解密类代码
2011/11/27 PHP
php文件缓存类用法实例分析
2015/04/22 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
JS判断两个时间大小的示例代码
2014/01/28 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
新手vue构建单页面应用实例代码
2017/09/18 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
python中wx将图标显示在右下角的脚本代码
2013/03/08 Python
Python制作Windows系统服务
2017/03/25 Python
Python实现PS图像抽象画风效果的方法
2018/01/23 Python
Pycharm更换python解释器的方法
2018/10/29 Python
Python面向对象程序设计类的封装与继承用法示例
2019/04/12 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
一家专门经营包包的英国网站:MyBag
2019/09/08 全球购物
C++是不是类型安全的
2014/02/18 面试题
大学应届生求职简历的自我评价
2013/10/08 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
安全目标管理责任书
2014/07/25 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
Java实现带图形界面的聊天程序
2022/06/10 Java/Android