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-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

原文链接:https://www.qdfuns.com/articl...

最新文章

  1. asp.net MVC 通用登录验证模块
  2. 野路子出身PowerShell 文件操作实用功能 MSSQL123
  3. Node.js 事件循环
  4. ABP的工作单元
  5. Qt 2D绘图 渐变填充(三种渐变方式)
  6. arm驱动linux异步通知与异步IO【转】
  7. maven自动下载jar包
  8. 关于js封装框架类库之选择器引擎(二)
  9. ueditor的工具按钮配置
  10. FTP服务器中vsftpd主配置文件解析
  11. 被动式Telnet研究及实现(解决内外网远程维护的困难)-part A
  12. 如何在Qt中使用自定义数据类型
  13. centos 7 mariadb安装
  14. [20190401]关于semtimedop函数调用.txt
  15. [转]ANTS Performance Profiler和ANTS Memory Profiler 使用
  16. 记一次ubuntuyu源码安装node.js
  17. Altium Designer PCB画板-交互式布局与模块化布局
  18. jQuery imgAreaSelect Examples
  19. POI导出Word插入复选框
  20. Haskell语言学习笔记(37)RWS, RWST

热门文章

  1. 怎样在QML中使用multitouch
  2. 让cocos2dx支持并通过arm64 编译
  3. &amp;lt;LeetCode OJ&amp;gt; 31. Next Permutation
  4. 怎样使用Eclipse PDT调试PHP程序
  5. 0x58 数据结构优化DP
  6. [ZJOI 2010] 数字计数
  7. Git 工具 - 子模块
  8. 2014/09/20 关于ArrayList的几种操作
  9. Hdu-6249 2017CCPC-Final G.Alice’s Stamps 动态规划
  10. 9.19[XJOI] NOIP训练37