javascript - 在 VueJS 中模拟子组件的 $emit 事件

标签 javascript vue.js

我有一个正在为其编写测试的 snackbar 组件。它包含一个子组件(一个按钮,单击时关闭 snackbar )。
此按钮发出 @click父级监听并运行方法以关闭 snackbar 或打开另一个的事件。
有没有办法模拟 $emit ?我似乎在任何地方都找不到与此相关的东西。

import { render, fireEvent, waitFor } from '@testing-library/vue';
import Snackbar from '../Snackbar.vue';
import EventBus from '@/services/EventBus';

describe('Snackbar', () => {
    const role = 'alert';
    
    it('should close snackbar on button click', async () => {
        const type = 'success';

        const { getByRole } = render(Snackbar, {
            // with this the button is inaccessible
            stubs: ['OBButton'],
        });

        await EventBus.$emit('addSnack', {
            type,
        });

        const snackbar = getByRole('alert');

        // this is wrong...
        await fireEvent.click(button);
  
        // this expect should be appropriate.
        expect(snackbar).not.toBeInTheDocument;
    });
});

这是组件的模板:
<template>
    <div class="snackbar-wrapper elevated">
        <transition name="snack-slide" v-on:after-leave="checkForMoreSnacks">
            <div
                role="alert"
                class="snack-data"
                v-if="currentSnack != null"
            >
                <span class="snack-text">{{ currentSnack.text }}</span>
                <OBButton
                    :text="currentSnack.buttonText"
                    @click="closeCurrentSnack"
                    :type="buttonType"
                ></OBButton>
            </div>
        </transition>
    </div>
</template>
附加信息:
  • 该组件永远不会被卸载。关闭它意味着设置 currentSnack值为null隐藏它。
  • 最佳答案

    使用触发器从子组件发出事件。你可以这样做:

    import ButtonComponent from '@/components/ButtonComponent.vue';
    import Snackbar from '@/components/Snackbar.vue';
    
    it('should foo', () => {
      const wrapper = shallowMount(Snackbar);
      wrapper.find(ButtonComponent).trigger('click');
      // Your assertions here
    
    })
    
    
    编辑:对于自定义事件更棘手。我目前正在 mock 这样的事件:
    const wrapper = shallowMount(Snackbar);
    const childWrapper = wrapper.find(ButtomComponent);
    childWrapper.vm.$emit('custom', { foo: 'bar' })
    
    

    关于javascript - 在 VueJS 中模拟子组件的 $emit 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65452654/

    相关文章:

    javascript - pdf渲染时显示加载图像

    javascript - 在 javascript 待办事项应用程序中制作计数器

    javascript - 试图确定一个对象是否在数组中,如果是,则将对象推送到它,如果不是,我会做其他事情

    javascript - Vue.js 在组件之间传递数据

    javascript - jQuery 按键事件监听器无法识别按键输入

    javascript - 忽略错误并继续在 IE 中运行 javascript?

    javascript - Vue/Nuxt-通过Vue插件观看/计算数组长度

    vue.js - 循环中元素的VueJS转换?

    javascript - 如何组织Vue-JS : Non Javascript way?

    javascript - 如何从服务器实时获取数据来更新我的图表?