详解在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 相关文章推荐
javascritp实现input输入框相关限制用法
Jun 29 Javascript
封装了jQuery的Ajax请求全局配置
Feb 05 Javascript
AngularJS基础知识笔记之表格
May 10 Javascript
基于javascript实现彩票随机数生成(升级版)
Apr 17 Javascript
JavaScript中的prototype原型学习指南
May 09 Javascript
jQuery.Ajax()的data参数类型详解
Jul 23 jQuery
微信小程序之蓝牙的链接
Sep 26 Javascript
vue组件中使用props传递数据的实例详解
Apr 08 Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 Javascript
JavaScript实现随机五位数验证码
Sep 27 Javascript
JavaScript常用工具函数大全
May 06 Javascript
Vue使用自定义指令实现拖拽行为实例分析
Jun 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+xslt在windows平台上
2006/10/09 PHP
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
基于vue v-for 循环复选框-默认勾选第一个的实现方法
2018/03/03 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
python实现抖音点赞功能
2019/04/07 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
如何通过命令行进入python
2020/07/06 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
2015年端午节活动总结
2015/02/11 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
python not运算符的实例用法
2021/06/30 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers