【发布时间】:2020-10-23 02:06:37
【问题描述】:
我正在使用带有 Jest (v24.9) 和 Vue-Test-Utils (v1.03) 的 Vue v2.6。
为了模拟一个方法,我见过两种不同的语法,
wrapper.vm.updateCart = jest.fn();
和
wrapper.setMethods({ updateCart: jest.fn() });
但第一个没有记录,而第二个已弃用(请参阅docs)。
问题在于,对于这两种方法,使测试通过的唯一方法是在模板中调用带有括号的方法,这很奇怪,因为我读过的所有文档都以某种方式鼓励使用不带括号的方法在模板中。
所以这个测试:
test('Click on .btn calls the right function', () => {
const wrapper = shallowMount(Modal, {
propsData: {
validate: jest.fn(),
},
});
wrapper.setMethods({ updateCart: jest.fn() });
const $btn = wrapper.find('.btn');
$btn.trigger('click');
expect(wrapper.vm.updateCart).toHaveBeenCalled();
});
只有当我用括号调用方法时才会通过:
<button class="btn" @click="updateCart()">
{{ dictionary('remove') }}
</button>
但否则会失败(例如,使用@click="updateCart")。
测试模板中的事件是否正在调用函数的正确语法是什么?
为什么文档中的弃用警告(here 和 here)将 setMethod api 定义为反模式?
也许只测试模板中的事件触发函数是错误的,因为框架(Vue)应该已经保证了这种行为,而我们应该只专注于测试函数本身?
编辑 07/02/2020
我也尝试了不同的语法:
const spy = jest.spyOn(wrapper.vm, 'updateCart');
const $btn = wrapper.find('.btn');
$btn.trigger('click');
expect(spy).toHaveBeenCalled();
这可以防止覆盖方法并替换对setMethods的调用,但仍然只有在使用括号调用函数时才能通过测试。
【问题讨论】:
标签: javascript vue.js jestjs vue-test-utils