javascript - VueJS / Jest - 测试是否从组件的方法调用导入的函数
问题描述
我有一个看起来像这样的 VueJS 2 组件:
<template>
<div>
<button @click="onFavorite">
Add to favorites
</button>
</div>
</template>
<script>
import { trackFavorite } from "@/utils/analytics";
export default {
name: "FavoriteButton",
methods: {
onFavorite() {
trackFavorite("click", "favorite");
[ ... ]
}
}
}
</script>
我想编写一个 Jest 测试来检查是否调用了onFavorite
run 。trackFavorite
尝试过这样的事情:
import { shallowMount } from '@vue/test-utils';
import FavoriteButton from '../FavoriteButton'
describe("FavoriteButton", () => {
let wrapper
beforeEach(() => {
wrapper = shallowMount(FavoriteButton)
})
describe('.onFavorite', () => {
beforeEach(() => {
wrapper.vm.trackFavorite = jest.fn()
wrapper.vm.onFavorite()
})
it('calls trackFavorite', () => {
expect(wrapper.vm.trackFavorite).toHaveBeenCalled()
})
})
})
但它不起作用,因为trackFavorite
它没有被 Jest 模拟函数取代。
解决方案
- 在测试文件的顶部使用
jest.mock()
来模拟整个导入(包括它的方法)。 require()
测试中的文件以访问模拟。- 使用模拟引用,验证模拟的
trackFavorite
方法是否被调用。
// FavoriteButton.spec.js
import { shallowMount } from '@vue/test-utils'
import FavoriteButton from '@/components/FavoriteButton.vue'
jest.mock('@/utils/analytics') 1️⃣
describe('FavoriteButton.vue', () => {
it('calls trackFavorite on button click', async () => {
const analytics = require('@/utils/analytics') 2️⃣
const wrapper = shallowMount(FavoriteButton)
await wrapper.find('button').trigger('click')
expect(analytics.trackFavorite).toHaveBeenCalled() 3️⃣
})
})
推荐阅读
- arrays - 数组在哈希表中变成字符串
- matrix - 最大值:将矩阵的列定义为向量
- reactjs - React 如何根据父函数更改子状态
- eclipse - eclipse:将项目的lib与maven的存储库同步
- plugins - PDI 8.2 Marketplace 不适用于 Ubuntu 18.04.2
- android - 比较两个位置以避免将相同位置保存在数据库中
- laravel-5 - Laravel 5.7 - 使用 updateOrInsert() 时查询构建器未正确转义引号或反斜杠
- typescript - 导出多个类打字稿
- python - 在客户端服务器程序中应该使用什么 IP 地址?
- c# - 在 docker 容器中使用 C# 访问 informix