在 vue-test-utils 中 mock 全局对象
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...
在 vue-test-utils 中 mock 全局对象的更多相关文章
- [百度空间] [转] 在 Visual C++ 中控制全局对象的初始化顺序
from: http://blog.csdn.net/classfactory/archive/2004/08/07/68202.aspx 在 C++ 中,同一个翻译单位(.cpp文件)里的全局对象的 ...
- 读书笔记-JavaScript中的全局对象
对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用.这个JavaScript自身提供的全局对象的功能包括: 1.全局对象拥有一些常用的属性 ...
- 如何在 vue 2.0+ 中引入全局的stylus文件,且能正常
由于stylus在引用时,不能像一般的css文件直接在main.js中引用,就算引用了也会只能使用转换后的css,不能使用里面的函数,方法等,原因可能是:在这里引入会被直接编译成css,不能在别的模板 ...
- [Vuejs] 在vue各个组件中应用全局scss变量
需要安装一个插件:sass-resources-loader 1.执行安装命令: npm i sass-resources-loader --save-dev 2.修改vue-cli环境下build文 ...
- node.js 中的全局对象
/** * Created by Administrator on 2016/8/29. */ const http = require("http"); const hostna ...
- js中的全局对象
- 从汇编看c++中全局对象和全局变量
先来看c++源码: #include <iostream> using namespace std; class X { public: int i; public: X() : i(ii ...
- JavaScript中的两种全局对象
这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...
- JavaScript 全局对象
全局属性和函数可用于所有内建的 JavaScript 对象. 顶层函数(全局函数) 函数 描述 decodeURI() 解码某个编码的 URI. decodeURIComponent() 解码一个编码 ...
随机推荐
- [Project]微信项目感悟
一定要先考虑好可复用部分,可以复制粘贴的地方 一定要先想好了在动 前台不同插件之间的兼容性问题可能是dom加载顺序的问题,有的代码可能要卸载其中一个插件的某个事件里
- iOS 加入粘贴板的功能(复制功能)
1. UIPasteboard *board = [UIPasteboard generalPasteboard]; board.string = @" 须要粘贴的问题字符串" ...
- ZOJ 1649 Rescue(有敌人迷宫BFS)
题意 求迷宫中从a的位置到r的位置须要的最少时间 经过'.'方格须要1s 经过'x'方格须要两秒 '#'表示墙 因为有1s和2s两种情况 须要在基础迷宫bfs上加些推断 令到达每一个点的时间初 ...
- 报错configure:error: no acceptable C compiler found in $PATH。。
报错configure:error: no acceptable C compiler found in $PATH.. 查看日志: 出错原因:新安装的linux系统,没有gcc库 解决方案:使用yu ...
- redis 学习笔记-cluster集群搭建
一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...
- git 本地项目推送至远程仓库
1 在本地文件夹下创建一个 Git 仓库(如test目录下) git init 2 此时test文件夹即是你的maste主分支,你可以在改文件夹下写自己的项目 3 将test文件夹下的内容提交至暂存区 ...
- AWS S3 对象存储服务
虽然亚马逊云非常牛逼,虽然亚马逊云财大气粗,虽然亚马逊用的人也非常多,可是这个文档我简直无法接受,特别是客服,令人发指的回复速度,瞬间让人无语,可是毕竟牛逼.忍了,躺一次坑而已 1.图片上传 1.1 ...
- MYSQL工具之binlog2sql闪回操作
文档结构: 在生产环境中如果遇到误删,改错数据的情况,利用mysql闪回工具binlog2sql,可以实现数据的快速回滚,从binlog中提取SQL,并能生成回滚SQL语句.Binlog以event作 ...
- 深入了解Token认证的来龙去脉
Token 是在服务端产生的,如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 Token 证明自己的合法地位. 不久 ...
- AtCoder Regular Contest 069
1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...