详解在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 相关文章推荐
JavaScript与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
js完美解决IE6不支持position:fixed的bug
Apr 24 Javascript
javascript的BOM汇总
Jul 16 Javascript
JS中使用DOM来控制HTML元素
Jul 31 Javascript
js实现图片360度旋转
Jan 22 Javascript
详解webpack-dev-server的简单使用
Apr 02 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 02 Javascript
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 Http_Template_IT类库进行模板替换
2009/03/19 PHP
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php中Ctype函数用法详解
2014/12/09 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
2017/03/02 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
对python中assert、isinstance的用法详解
2019/11/27 Python
python标识符命名规范原理解析
2020/01/10 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
医药工作岗位求职信分享
2013/12/31 职场文书
博士论文答辩开场白
2015/06/01 职场文书
新人入职感言
2015/07/31 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
zabbix配置nginx监控的实现
2022/05/25 Servers
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python
mysql sock 文件解析及作用讲解
2022/07/15 MySQL