我正在尝试为我的父组件编写一个测试,我希望在其中触发doSomething
方法并Assert该操作。
父组件:
<div>
<DropdownContainer v-model="selectedTitle" title="dropdown-title"
:options="dropdownOption" @load-data="doSomething"
dropdown-data-test="dropdown-test"/>
</div>
doSomething() {
console.log('I am getting called');
}
字符串
子组件
<template>
<Dropdown :model-value="modelValue" :options="options" :data-test="dropdownDataTest"
@change="emitEvent">
</Dropdown>
</template>
export default {
name: "DropdownContainer",
emits: ['update:modelValue', 'load-data'],
methods: {
emitEvent(event) {
this.$emit('update:modelValue', event.value);
this.emitChangeEvent && this.$emit('load-data')
}
}
}
x
parent-component.spec.js
it('should call dropdown load-data method',async () => {
const wrapper = mount(Parent)
const dropdown = wrapper.findComponent('[data-test="dropdown-test"]')
await dropdown.trigger('load-data');
});
的字符串
现在,当我运行测试时,测试通过了,因为没有Assert,但我没有看到父组件doSomething
控制台日志被调用。
但是,如果我将子组件中的emits
声明从emits: ['update:modelValue', 'load-data']
更改为emits: ['update:modelValue']
,
然后我的父组件测试通过并打印控制台日志,这意味着父组件实际上调用了doSomething
方法,我不知道为什么。
有什么我做错了,因为根据官方文档,我们应该列出所有发出的事件,但我的测试失败,因为这一点。提前感谢。
注意:我正在使用Vue 3,Vue/test-utils和Primevue组件库。该功能工作正常,只是测试问题。
1条答案
按热度按时间h22fl7wq1#
问题出在. VTU上。正如docs所说,它会在DOM节点上触发事件。如果你在
emits
块中显式指定事件,它会说你的组件会触发它。否则VTU只会触发load-data
事件作为DOM节点事件。在您的情况下,您应该使用
$emit
字符串