详解在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 相关文章推荐
cnblogs 代码高亮显示后的代码复制问题解决实现代码
Dec 14 Javascript
那些年,我还在学习jquery 学习笔记
Mar 05 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
Apr 17 Javascript
jquery和ajax的关系详细介绍
Nov 29 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
jQuery unbind()方法实例详解
Jan 19 Javascript
最细致的vue.js基础语法 值得收藏!
Nov 03 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
Dec 30 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 Javascript
详解webpack打包后如何调试的方法步骤
Nov 07 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
vue组件化中slot的基本使用方法
May 01 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模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
AngularJS API之copy深拷贝详解及实例
2016/09/14 Javascript
js遮罩效果制作弹出注册界面效果
2017/01/25 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
python pdb调试方法分享
2014/01/21 Python
实例Python处理XML文件的方法
2015/08/31 Python
利用Python如何生成随机密码
2016/04/20 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python实现KNN邻近算法
2021/01/28 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
python元组的概念知识点
2019/11/19 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
怎样从/向数据文件读/写结构
2014/11/23 面试题
简历中自我评价分享
2013/10/09 职场文书
人力资源管理专业学生自我评价
2013/11/20 职场文书
2014全国两会心得体会
2014/03/17 职场文书
请假条格式范文
2014/04/10 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers