vue-test-utils
提供了一种 mock 掉 Vue.prototype
的简单方式,不但对测试用例适用,也能够为全部测试设置默认的 mock。javascript
mocks
加载选项 是一种将任何属性附加到 Vue.prototype
上的方式。这一般包括:html
$store
, for Vuexvue
$router
, for Vue Routerjava
$t
, for vue-i18nbash
以及其余种种。app
咱们来看一个 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
运行测试将抛出一堆错误堆栈。若仔细端详输出则会发现:ui
[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
选项用处多多,而我以为最最经常使用的正是开头提到过的那三样。
(译注:经过这种方式就不能在单元测试中耦合与特定语言相关的内容了,由于翻译功能实际上已失效,也更没法处理可选参数等)
有时须要一个 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