关于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 相关文章推荐
关于取不到由location.href提交而来的上级页面地址的解决办法
Jul 30 Javascript
javascript向flash swf文件传递参数值注意细节
Dec 11 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
Extjs4 类的定义和扩展实例
Jun 28 Javascript
js实现动态加载脚本的方法实例汇总
Nov 02 Javascript
微信小程序 网络API 上传、下载详解
Nov 09 Javascript
JavaScript省市级联下拉菜单实例
Feb 14 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
Mar 08 Javascript
AngularJS中controller控制器继承的使用方法
Nov 03 Javascript
关于js陀螺仪的理解分析
Apr 11 Javascript
vue获取验证码倒计时组件
Aug 26 Javascript
在vue-cli创建的项目中使用sass操作
Aug 10 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
在php中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
php eval函数一句话木马代码
2015/05/21 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
jquery操作对象数组元素方法详解
2014/11/26 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
2019/09/05 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
基于python实现查询ip地址来源
2020/06/02 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
"序列点" 是什么
2016/07/29 面试题
员工评语大全
2014/01/19 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
会议简报格式范文
2015/07/20 职场文书
大学同学聚会感言
2015/07/30 职场文书
apache ftpserver搭建ftp服务器
2022/05/20 Servers