Vue 全家桶单元测试简要指南
此文已由作者张汉锐授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
vue 的单元测试环境
按照目前全家桶的情况,是需要 webpack 的支持的。可以直接使用 vue-cli ,选择 webpack 模版,里面会有完整的单元测试 & 端对端测试的配置。如果想要自己配置,则在配置完基本的 karma 测试环境之后,将 webpack 加入到 preprocessor 上。
测试覆盖率
同理 vue-cli 的 webpack 模版已经做的很完善了。如果不想用全家桶,在不需要 babel 编译的情况下,单元测试覆盖率的计算,可以通过 istanbul 实现,具体可以看 istanbul 文档。但如果需要经过 babel 编辑的话,就需要借助 babel-plugin-istanbul。
vue 组件(文件)的单元测试
主要考虑几个点:
组件的方法测试
组件 props 的测试
组件 UI 的更新测试(异步的)
组件通信的测试
具体参考官网 Unit Testing ,里面提供了很清晰的例子,这里就不做搬运工了。
vuex 的单元测试
vuex 的测试相对简单,vuex 主要的测试对象就是 mutation, action, getter 这些。其中 :
mutation:接受一个 state 为参数,并改变state 的属性。 所以测试时候时候,mock 一个 state,接着调用 mutataions,断言一下 state 的变化是否是预期的。
action: 这个比较绕,他可以 commit 多个 mutataion,也可以异步, 所以测试目标就变成了 action 每一个 commit 是否正确。思路上,mock 一个 commit 函数,在 commit 函数中记录每次 mutaion 的 type 和数据,然后和期望的对比。
getter:略
PS: 如果 mock ajax 或者 setTimeout, setInterval 这些,可以使用 mock 库 sinon ,关键词 spy,stub,fakeServer 。
关于 vuex 单元测试的详细列子说明,可以参考 官网的文档 Unit Testing
vue + vuex 的单元测试
也就是:vue 组件中依赖了 vuex 的 mutation, actions, getters 的时候 ,vue 如何做测试比较好。
vue-loader 文档 给出了方法。
首先,社区有个 inject-loader 能够 mock 依赖,看看下面例子
// log.jsvar myUtils = require('./utils');
myUtils.log('hi');// test.jsvar inject = require('!!vue-loader?inject!./log.js')var myLog = inject({ './utils':{
log(){ //....
}
}
})
inject-loader 能够在加载 log.js 时候,允许我们 mock log.js 的依赖。所以当组件依赖 vuex 的时候,就可以通过 inject-loader 来 mock 依赖,从而方便将 vuex 和 vue 组件的测试分开。
具体的原理和使用方法,可以看上面给出的文档。
(注意,文档说的 inject-loader@3.x is currently unstable ,文档演示的例子也是提示安装 2.0 ,实际上现在 3.0 已经稳定了,参考这里。使用 2.0 反而问题多多)
其他
参考资料:
tips:记得安装 sinon,chai 的 types 文件,写起测试来会很爽
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 如何准确又通俗易懂地解释大数据及其应用价值?
【推荐】 AndroidTV开发(3)
Vue 全家桶单元测试简要指南的更多相关文章
- 用 Vue 全家桶二次开发 V2EX 社区
一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...
- Vue全家桶
简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...
- 从零开始系列之vue全家桶(3)安装使用vuex
什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...
- 使用vue全家桶制作博客网站
前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...
- 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程
使用vue全家桶制作博客网站 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...
- Vue全家桶介绍
一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...
- 一个简单的假vue全家桶(vue+vue-router+require)
首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...
- Vue 全家桶 + Electron 开发的一个跨三端的应用
代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...
- Vue全家桶了解一下(待补充)
vue全家桶了解一下 一.vue+vue-router+vuex+axios1.vue:使用vue-cli,生成最基本的vue项目2.vue-router:vue项目中的路由管理插件3.vuex:vu ...
随机推荐
- java:eclipse安装tomcat插件及配置tomcat
我们都知道myeclipse自带tomat图标,而eclipse却没有,若想eclipse实现带有tomcat图标可以下载tomcat插件 tomcat插件下载地址:http://www.eclips ...
- 【DP专辑】ACM动态规划总结(转)
http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...
- python中类__call__方法与@classmethod
实现了__call__方法的类就变成了一个可调用对象,可以像函数一样调用,callable(obj)就返回True,否则返回False. 参考:https://www.cnblogs.com/supe ...
- CF221C Circling Round Treasures
题目大意 给定一个$n\times m$的网格$(n,m\leq 20)$,每个格子都是$S\space \#\space B\space x\space .$中第一个. $S$表示起点,保证有且仅有 ...
- bzoj1002轮状病毒
高精度练习题 根据什么什么基尔霍夫矩阵 反正就是高精度练习 #include<iostream> #include<cstdio> using namespace std; s ...
- js中eval详解
先来说eval的用法,内容比较简单,熟悉的可以跳过 eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. ...
- [转]CSS遮罩——如何在CSS中使用遮罩
特别声明:此篇文章由D姐根据Christian Schaefer的英文文章原名<CSS Masks – How To Use Masking In CSS Now>进行翻译,整个译文带有我 ...
- hdu 5909 Tree Cutting —— 点分治
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5909 点分治,每次的 rt 是必选的点: 考虑必须选根的一个连通块,可以DP,决策就是在每个子树中决定选不 ...
- xml schema 中如何定义类似Map的结构
利用xs:unique关键字.在xs:element里添加unique节点,任意命名,然后用xs:selector来选择需要唯一的域, xs:field 里指定特定的字段. 例如:定义所有Item里的 ...
- shell ## %% 使用说明
path='apps/home/usr/app/test.txt' a=${path##*/} b=${path#*/} c=${path%%/*} d=${path%/*}············· ...