内容简介:原文:https://itnext.io/mocking-global-objects-in-vue-test-utils-a8822df013a8
原文: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 全局对象》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Node.js 全局对象
- Webform 内置对象 Session对象、Application全局对象,ViewState详细介绍
- Node.js基础 23456:全局对象,回调函数,模块,事件,读写文件(同步,异步)
- 全局变量,静态全局变量,局部变量,静态局部变量
- Thrift RPC 系列教程(2)——全局变量&全局常量
- 全局角度出发讨论敏捷
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。