详解在vue-test-utils中mock全局对象
vue-test-utils 提供了一种mock掉 Vue.prototype 的简单方式,不但对测试用例适用,也可以为所有测试设置默认的mock。
mocks 加载选项
mocks 加载选项 是一种将任何属性附加到 Vue.prototype 上的方式。这通常包括:
- $store,forVuex
- $router,forVueRouter
- $t,forvue-i18n
以及其他种种。
vue-i18n 的例子
我们来看一个vue-i18n 的例子。虽然可以为每个测试用到 createLocalVue 并安装 vue-i18n,但那样可能会让事情难以处理并引入一堆样板。首先,组件
{{$t("helloWorld")}}
你先在另一个文件中弄好翻译,然后通过$t 引用,这就是 vue-i18n 的工作方式。在本次测试中,虽然并不会真正关心翻译文件看起来什么样,不过还是看一看这次用到的:
exportdefault{ "en":{ helloWorld:"Helloworld!" }, "ja":{ helloWorld:"こんにちは、世界!" } }
基于这个locale,正确的翻译将被渲染出来。我们先不用mock,尝试在测试中渲染该组件:
import{shallowMount}from"@vue/test-utils" importBilingualfrom"@/components/Bilingual.vue" describe("Bilingual",()=>{ it("renderssuccessfully",()=>{ constwrapper=shallowMount(Bilingual) }) })
通过yarntest:unit 运行测试将抛出一堆错误堆栈。若仔细端详输出则会发现:
[Vuewarn]:Errorinconfig.errorHandler:"TypeError:_vm.$tisnotafunction"
这是因为我们并未安装vue-i18n,所以全局的 $t 方法并不存在。我们试试 mocks 加载选项:
import{shallowMount}from"@vue/test-utils" importBilingualfrom"@/components/Bilingual.vue" describe("Bilingual",()=>{ it("renderssuccessfully",()=>{ constwrapper=shallowMount(Bilingual,{ mocks:{ $t:(msg)=>msg } }) }) })
现在测试通过了!mocks 选项用处多多,而我觉得最最常用的正是开头提到过的那三样。
(译注:通过这种方式就不能在单元测试中耦合与特定语言相关的内容了,因为翻译功能实际上已失效,也更无法处理可选参数等)
使用配置设置默认的mocks
有时需要一个mock的默认值,这样就不用为每个测试用例都设置一遍了。可以用vue-test-utils 提供的 config API来实现。还是 vue-i18n 的例子:
importVueTestUtilsfrom"@vue/test-utils" VueTestUtils.config.mocks["mock"]="DefaultMockValue"
这个示例中用到了Jest,所以我将把默认mock描述在jest.init.js 文件中--该文件会在测试运行前被自动加载。同时我也会导入并应用此前用于示例的翻译对象。
//jest.init.js importVueTestUtilsfrom"@vue/test-utils" importtranslationsfrom"./src/translations.js" constlocale="en" VueTestUtils.config.mocks["$t"]=(msg)=>translations[locale][msg]
现在尽管还是用了一个mock过的$t 函数,但会渲染一个真实的翻译了。再次运行测试,这次移除了 mocks 加载选项并用 console.log 打印了 wrapper.html()。
describe("Bilingual",()=>{ it("renderssuccessfully",()=>{ constwrapper=shallowMount(Bilingual) console.log(wrapper.html()) }) })
测试通过,以下结构被渲染出来:
Helloworld!
(译注:依然无法应付复杂的翻译)
总结
本文论述了:
- 在测试用例中使用mocks 以mock一个全局对象
- 用config.mocks 设置默认的mock
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。