详解在vue-test-utils中mock全局对象


Posted in Javascript onNovember 07, 2018

vue-test-utils   提供了一种 mock 掉   Vue.prototype   的简单方式,不但对测试用例适用,也可以为所有测试设置默认的 mock。

mocks   加载选项

mocks   加载选项   是一种将任何属性附加到   Vue.prototype   上的方式。这通常包括:

  • $store , for Vuex
  • $router , for Vue Router
  • $t , for vue-i18n

以及其他种种。

vue-i18n   的例子

我们来看一个 vue-i18n   的例子。虽然可以为每个测试用到   createLocalVue   并安装   vue-i18n ,但那样可能会让事情难以处理并引入一堆样板。首先,组件   <Bilingual>   用到了   vue-i18n :

<template>
 <div class="hello">
  {{ $t("helloWorld") }}
 </div>
</template>

<script>
 export default {
  name: "Bilingual"
 }
</script>

你先在另一个文件中弄好翻译,然后通过 $t   引用,这就是   vue-i18n   的工作方式。在本次测试中,虽然并不会真正关心翻译文件看起来什么样,不过还是看一看这次用到的:

export default {
 "en": {
  helloWorld: "Hello world!"
 },
 "ja": {
  helloWorld: "こんにちは、世界!"
 }
}

基于这个 locale,正确的翻译将被渲染出来。我们先不用 mock,尝试在测试中渲染该组件:

import { shallowMount } from "@vue/test-utils"
import Bilingual from "@/components/Bilingual.vue"

describe("Bilingual", () => {
 it("renders successfully", () => {
  const wrapper = shallowMount(Bilingual)
 })
})

通过 yarn test:unit   运行测试将抛出一堆错误堆栈。若仔细端详输出则会发现:

[Vue warn]: Error in config.errorHandler: "TypeError: _vm.$t is not a function"

这是因为我们并未安装 vue-i18n ,所以全局的   $t   方法并不存在。我们试试   mocks   加载选项:

import { shallowMount } from "@vue/test-utils"
import Bilingual from "@/components/Bilingual.vue"

describe("Bilingual", () => {
 it("renders successfully", () => {
  const wrapper = shallowMount(Bilingual, {
   mocks: {
    $t: (msg) => msg
   }
  })
 })
})

现在测试通过了! mocks   选项用处多多,而我觉得最最常用的正是开头提到过的那三样。

(译注:通过这种方式就不能在单元测试中耦合与特定语言相关的内容了,因为翻译功能实际上已失效,也更无法处理可选参数等)

使用配置设置默认的 mocks

有时需要一个 mock 的默认值,这样就不用为每个测试用例都设置一遍了。可以用 vue-test-utils   提供的   config   API 来实现。还是   vue-i18n   的例子:

import VueTestUtils from "@vue/test-utils"

VueTestUtils.config.mocks["mock"] = "Default Mock Value"

这个示例中用到了 Jest,所以我将把默认 mock 描述在 jest.init.js   文件中 -- 该文件会在测试运行前被自动加载。同时我也会导入并应用此前用于示例的翻译对象。

//jest.init.js

import VueTestUtils from "@vue/test-utils"
import translations from "./src/translations.js"

const locale = "en"

VueTestUtils.config.mocks["$t"] = (msg) => translations[locale][msg]

现在尽管还是用了一个 mock 过的 $t   函数,但会渲染一个真实的翻译了。再次运行测试,这次移除了   mocks   加载选项并用   console.log   打印了   wrapper.html() 。

describe("Bilingual", () => {
 it("renders successfully", () => {
  const wrapper = shallowMount(Bilingual)

  console.log(wrapper.html())
 })
})

测试通过,以下结构被渲染出来:

<div class="hello">
 Hello world!
</div>

(译注:依然无法应付复杂的翻译)

总结

本文论述了:

  • 在测试用例中使用 mocks   以 mock 一个全局对象
  • 用 config.mocks   设置默认的 mock

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
js 字符串转换成数字的三种方法
Mar 23 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
js随机生成网页背景颜色的方法
Feb 26 Javascript
JavaScript实现倒计时跳转页面功能【实用】
Dec 13 Javascript
Vue中计算属性computed的示例解读
Jul 26 Javascript
详解 vue better-scroll滚动插件排坑
Feb 08 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
vue组件实现可搜索下拉框扩展
Oct 23 Javascript
关于vue.js中实现方法内某些代码延时执行
Nov 14 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
Jan 18 Javascript
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
vue-cli 首屏加载优化问题
Nov 06 #Javascript
Vue 实时监听窗口变化 windowresize的两种方法
Nov 06 #Javascript
vue组件tabbar使用方法详解
Nov 06 #Javascript
微信小程序下拉框功能的实例代码
Nov 06 #Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 #Javascript
小程序实现页面顶部选项卡效果
Nov 06 #Javascript
Vue常用的几个指令附完整案例
Nov 06 #Javascript
You might like
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
javascript 静态对象和构造函数的使用和公私问题
2010/03/02 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
2015/02/20 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
深入理解python对json的操作总结
2017/01/05 Python
Python实现调度算法代码详解
2017/12/01 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
python通过zabbix api获取主机
2018/09/17 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
在Django中实现添加user到group并查看
2019/11/18 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
python中字典增加和删除使用方法
2020/09/30 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
交通安全寄语大全
2014/04/08 职场文书
解除财产保全担保书
2014/05/20 职场文书
运动会口号8字
2014/06/07 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
四风问题自我剖析材料
2014/10/07 职场文书
离婚纠纷代理词
2015/05/23 职场文书
工作收入证明模板
2015/06/12 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书