详解在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移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
Oct 10 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
Apr 11 Javascript
微信小程序如何再次获取用户授权的方法
May 10 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
Jun 07 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 Javascript
layer扩展打开/关闭动画的方法
Sep 23 Javascript
vue点击页面空白处实现保存功能
Nov 06 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中使用XML
2006/10/09 PHP
php 表单验证实现代码
2009/03/10 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
php对称加密算法示例
2014/05/07 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
asp.net和php的区别点总结
2019/10/10 PHP
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
基于json的jquery地区联动效果代码
2011/07/06 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
简介Django框架中可使用的各类缓存
2015/07/23 Python
Pandas分组与排序的实现
2019/07/23 Python
python的Jenkins接口调用方式
2020/05/12 Python
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
数据库方面面试题
2012/04/22 面试题
小学科学教学反思
2014/01/26 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
企业安全生产责任书范本
2014/07/28 职场文书
教师节学生演讲稿
2014/09/03 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
导游词之任弼时故居
2020/01/07 职场文书