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 的例子:
新聞熱點
疑難解答
圖片精選