关于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之二(两种扩展)
Jun 11 Javascript
JQuery与JSon实现的无刷新分页代码
Sep 13 Javascript
通过jQuery源码学习javascript(一)
Dec 27 Javascript
解析JavaScript的ES6版本中的解构赋值
Jul 28 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
浅谈JS验证表单文本域输入空格的问题
Feb 14 Javascript
element-ui table span-method(行合并)的实现代码
Dec 20 Javascript
使用element-ui table expand展开行实现手风琴效果
Mar 15 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
Sep 18 Javascript
countUp.js实现数字滚动效果
Oct 18 Javascript
Node.js实现批量下载图片简单操作示例
Jan 18 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出现403错误的解决办法
2014/05/29 PHP
百万级别知乎用户数据抓取与分析之PHP开发
2015/09/28 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
js中日期的加减法
2015/05/06 Javascript
JS实现仿PS的调色板效果完整实例
2016/12/21 Javascript
JS实现的tab切换选项卡效果示例
2017/02/28 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
JS中准确判断变量类型的方法
2020/06/01 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
为python设置socket代理的方法
2015/01/14 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
Python打包可执行文件的方法详解
2016/09/19 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
html5 Canvas画图教程(1)—画图的基本常识
2013/01/09 HTML / CSS
医学生求职自荐信
2013/10/25 职场文书
高校教师思想汇报
2014/01/11 职场文书
公积金转移接收函
2014/01/11 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
小学运动会报道稿
2015/07/22 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL