详解在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 相关文章推荐
JS宝典学习笔记(下)
Jan 10 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
实现js保留小数点后N位的代码
Nov 13 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
ztree实现权限横向显示功能
May 20 Javascript
小程序清理本地缓存的方法
Aug 17 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 Javascript
LayUi数据表格自定义赋值方式
Oct 26 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 Javascript
一起来看看Vue的核心原理剖析
Mar 24 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
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
Django数据库操作的实例(增删改查)
2017/09/04 Python
python二进制文件的转译详解
2019/07/03 Python
Python帮你识破双11的套路
2019/11/11 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
python 如何上传包到pypi
2020/12/24 Python
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
领导视察欢迎词
2014/01/15 职场文书
投标邀请书范文
2014/01/31 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
离婚协议书怎么写
2014/09/12 职场文书
荆州古城导游词
2015/02/06 职场文书
优秀团员个人总结
2015/02/26 职场文书
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs
MySQL池化框架学习接池自定义
2022/07/23 MySQL
TS 类型收窄教程示例详解
2022/09/23 Javascript