我有一个正在为其编写测试的 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/