此文已由作者张汉锐授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

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 反而问题多多)

其他

参考资料:

  • sinon

  • chai 可以选择不同的断言库,咱么选用的是 expect

tips:记得安装 sinon,chai 的 types 文件,写起测试来会很爽

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 如何准确又通俗易懂地解释大数据及其应用价值?
【推荐】 AndroidTV开发(3)

Vue 全家桶单元测试简要指南的更多相关文章

  1. 用 Vue 全家桶二次开发 V2EX 社区

    一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...

  2. Vue全家桶

    简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...

  3. 从零开始系列之vue全家桶(3)安装使用vuex

    什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...

  4. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  5. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  6. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  7. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

  8. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  9. Vue全家桶了解一下(待补充)

    vue全家桶了解一下 一.vue+vue-router+vuex+axios1.vue:使用vue-cli,生成最基本的vue项目2.vue-router:vue项目中的路由管理插件3.vuex:vu ...

随机推荐

  1. Thriftpy一个简单的例子

    sleep.thrift文件(什么是thrift文件?),文件内容如下,该文件定义了一个Sleep服务,该服务提供一个sleep方法,sleep方法接受一个32位int类型的参数且没有返回值 serv ...

  2. node.js抓取网上图片保存到本地

    用到两个模块,http和fs var http = require("http");var fs = require("fs"); var server = h ...

  3. SmartGit(试用期30后),个人继续使用的方法。

    在我们做项目的过程中,我们会用到SmartGit这个软件来将本地的MAVEN项目push到国内的码云(https://git.oschina.net)或者是国外的github网站进行项目的管理,这个时 ...

  4. freeMarker(五)——模板开发指南补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南补充知识 1. 自定义指令 自定义指令可以使用 macro ...

  5. luogu1776宝物筛选

    多重背包问题 一开始我们的转移方程是 ;i<=n;i++) for(int j=m;j>=w[i];j--) ;k<=c[i];k++) )dp[j]=max(dp[j],dp[j- ...

  6. CH5103 [NOIP2008]传纸条[线性DP]

    给定一个 N*M 的矩阵A,每个格子中有一个整数.现在需要找到两条从左上角 (1,1) 到右下角 (N,M) 的路径,路径上的每一步只能向右或向下走.路径经过的格子中的数会被取走.两条路径不能经过同一 ...

  7. Django来敲门~第一部分【4. 创建第一个模块应用】

    成若缺,其用不弊.大盈若冲,其用不穷.大直若屈.大巧若拙.大辩若讷.静胜躁,寒胜热.清静为天下正 ——老子<道德经> 本章内容 创建应用(app) 开发第一个视图(View) URL访问配 ...

  8. Python的几种版本的不同实现

    Python自身作为一门编程语言,它有多种实现.这里的实现指的是符合Python语言规范的Python解释程序以及标准库等.这些实现虽然实现的是同一种语言,但是彼此之间,特别是与CPython之间还是 ...

  9. 对API的理解

    一. API(Application Programming Interface,应用程序编程接口) 1)定义:API是远程服务器或者操作系统的一些函数,是它们的一部分: 2)功能:用来接收应用程序( ...

  10. DDoS攻防战(二):CC攻击工具实现与防御理论--删除

    我们将要实现一个进行应用层DDoS攻击的工具,综合考虑,CC攻击方式是最佳选择,并用bash shell脚本来快速实现并验证这一工具,并在最后,讨论如何防御来自应用层的DDoS攻击. 第一步:获取大量 ...