Vue Test utils自定义事件触发器不工作

hc2pp10m  于 2023-11-21  发布在  Vue.js
关注(0)|答案(1)|浏览(156)

我正在尝试为我的父组件编写一个测试,我希望在其中触发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组件库。该功能工作正常,只是测试问题。

h22fl7wq

h22fl7wq1#

问题出在. VTU上。正如docs所说,它会在DOM节点上触发事件。如果你在emits块中显式指定事件,它会说你的组件会触发它。否则VTU只会触发load-data事件作为DOM节点事件。
在您的情况下,您应该使用$emit

wrapper.findComponent('[data-test="dropdown-test"]').vm.$emit('load-data')

await wrapper.vm.$nextTick() // Wait until $emits have been handled
// then
expect(wrapper.emitted('first-event'))...
expect(wrapper.emitted('second-event'))...

字符串

相关问题