Bootstrap-Vue 组件上的触发事件(测试)

Posted

技术标签:

【中文标题】Bootstrap-Vue 组件上的触发事件(测试)【英文标题】:Trigger Event on Bootstrap-Vue Component (testing) 【发布时间】:2020-04-26 15:33:15 【问题描述】:

我正在一个 vue 应用程序中编写测试(使用 Jest)。在测试某个组件时,我需要在一个复选框上触发一个更改事件(我正在使用BFormCheckbox)。

当我使用选择器选择复选框时,实际复选框的计算结果为 ('.custom-control-input'),我可以通过下面的测试。但是,我想使用实际组件的名称 (BFormCheckbox),我觉得这样更容易理解。有什么办法可以做到这一点?

      it('is triggered by clicking a phase checkbox', () => 
        // I would like to write:
        // const phaseCheckbox = wrapper.find(BFormCheckbox);

        // However, I can only get the following to work:
        const phaseCheckbox = wrapper.find('.custom-control-input');

        // this is true for both selectors
        expect(phaseCheckbox.exists()).toBe(true);

        phaseCheckbox.trigger('change');

        // this fails for wrapper.find(BFormCheckbox)
        expect(togglePhaseSpy).toHaveBeenCalled();
      );

【问题讨论】:

@JesusGalvan 谢谢!这样做似乎有点脆弱 - 你有什么办法让它更健壮吗? BFormCheckbox 生成 html,其中嵌套了隐藏的复选框。试试这个:const phaseCheckbox = wrapper.find(BFormCheckbox).find('input')。这在以普通模式、按钮模式和切换模式呈现时也可以工作,因为您没有将其绑定到特定的类名。 您可以看到 BootstrapVue 如何测试 b-form-checkbox here。 您是否导入了BFormCheckbox 组件? 【参考方案1】:

由于<input type="checkbox"> 嵌套在额外的 HTML 标记中(由 Bootstrap v4 定义),请使用以下命令访问隐藏的输入:

const phaseCheckbox = wrapper.find(BFormCheckbox).find('input')

这不会束缚你使用内部元素类名,因为它们会根据<b-form-checkbox> 的呈现样式模式(即默认自定义复选框、切换样式复选框、按钮样式复选框或普通模式复选框)而改变)。

【讨论】:

【参考方案2】:

Jest documentation 展示了如何按照您的要求进行操作的示例。

组件构造函数:

import Foo from '../components/Foo';

const wrapper = mount(<MyComponent />);
expect(wrapper.find(Foo)).to.have.lengthOf(1);

组件显示名称:

const wrapper = mount(<MyComponent />);
expect(wrapper.find('Foo')).to.have.lengthOf(1);

【讨论】:

对,在页面上肯定可以找到组件。我只是希望能够直接在他们身上触发事件。但是上面特洛伊的回答是一个很好的替代品。

以上是关于Bootstrap-Vue 组件上的触发事件(测试)的主要内容,如果未能解决你的问题,请参考以下文章

动态添加时第一个组件上的单击组件触发事件

Angular 5 组件测试选择和触发事件

如何测试从子组件触发的自定义事件

如何测试在悬停/鼠标悬停时调用了 Vue 指令?

Vue父组件调用子组件事件的两种方法

ListCellRenderer 不在子组件上触发事件