未加星标

[译] 在 vue-test-utils 中 mock 全局对象

字体大小 | |
[前端(javascript) 所属分类 前端(javascript) | 发布者 店小二05 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏

[译] 在 vue-test-utils 中 mock 全局对象

原文:https://itnext.io/mocking-global-objects-in-vue-test-utils-a8822df013a8

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

--End--

搜索 fewelife 关注公众号


[译] 在 vue-test-utils 中 mock 全局对象

转载请注明出处

本文前端(javascript)相关术语:javascript是什么意思 javascript下载 javascript权威指南 javascript基础教程 javascript 正则表达式 javascript设计模式 javascript高级程序设计 精通javascript javascript教程

代码区博客精选文章
分页:12
转载请注明
本文标题:[译] 在 vue-test-utils 中 mock 全局对象
本站链接:https://www.codesec.net/view/610700.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 前端(javascript) | 评论(0) | 阅读(117)