无法在 Vue 3 setup() 中监视函数
Posted
技术标签:
【中文标题】无法在 Vue 3 setup() 中监视函数【英文标题】:Cannot spyOn functions inside of Vue 3 setup() 【发布时间】:2021-02-09 02:51:59 【问题描述】:如何使用 Jest 编写一个调用 resetTimer
并检查 startTimer
是否也被调用的测试?
代码:
setup ()
const startTimer = () =>
// ...
;
const resetTimer = () =>
startTimer();
;
return
startTimer,
resetTimer
测试:
import shallowMount from '@vue/test-utils';
import Overlay from '@/components/Overlay.vue';
const wrapper = shallowMount(Overlay);
it('resetTimer should call startTimer', () =>
const spy = jest.spyOn(wrapper.vm, 'resetTimer');
wrapper.vm.startTimer();
expect(spy).toHaveBeenCalled();
);
结果:
TypeError: object.hasOwnProperty is not a function
187 |
188 | it('resetTimer should call startTimer', () =>
> 189 | const spy = jest.spyOn(wrapper.vm, 'resetTimer');
| ^
190 | wrapper.vm.startTimer();
191 | expect(spy).toHaveBeenCalled();
192 | );
谢谢!
【问题讨论】:
好问题,让我想知道模拟和间谍如何在合成函数中发挥作用。也许您可以在测试中替换组件上的setup
,在它返回之前执行spy
?
【参考方案1】:
找到了一个临时解决方案,不是最好的,但至少可以让您检查它是否被调用。
import mount from '@vue/test-utils';
import Component from './Component.vue';
describe('Component', () =>
it('should call foo', () =>
Component.created = function ()
this.foo = jest.fn(this.foo);
;
const component = mount(Component);
component.find('div').trigger('click');
component.vm.foo();
expect(component.vm.foo).toHaveBeenCalled();
delete Component.created;
);
);
【讨论】:
以上是关于无法在 Vue 3 setup() 中监视函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Typescript 在 Vue 3.0 setup() 函数中使用 async/await
vue3.0 Composition API 上手初体验 神奇的 setup 函数 生命周期函数