【问题标题】:Error: Method “props” is only meant to be run on a single node. 2 found instead错误:方法“props”仅用于在单个节点上运行。找到了 2 个
【发布时间】:2019-11-26 03:40:10
【问题描述】:
it('should call setCampaignDate on click', function () {
    let spySetCampaign = sinon.spy(wrapper.instance(), 'setCampaignDate');
    let datePickers = wrapper.find('.campaign-date-tab').dive().find(Datepicker);
    assert.equal(datePickers.length, 2);
    console.log(datePickers);
    var date = new Date();

    for (let index = 0; index < datePickers.length; index++) {
      datePickers.simulate('change'); 
      sinon.assert.calledOnce(spySetCampaign.withArgs(date, 'startDate'));
    }


  });

我正在尝试模拟我的“更改”功能并尝试测试是否调用了“setCampaignDate”。这里的问题是我find返回的浅层组件的长度是2:

let datePickers = wrapper.find('.campaign-date-tab').dive().find(Datepicker);

当尝试在“datepickers”上调用模拟时,会出现如下错误:

'Error: Method “props” is only meant to be run on a single node. 2 found instead.'.

不确定如何在节点数大于 1 的组件上进行模拟。

【问题讨论】:

    标签: reactjs chai-enzyme


    【解决方案1】:

    在不更改代码的情况下使用多个组件的答案是使用酶 API 来获取所需按钮的正确索引。

    wrapper.find(Component).at(index).simulate('click');
    

    component 是您要测试的任何内容的名称,index 是您想要的数字。

    【讨论】:

      【解决方案2】:

      我认为你应该添加.first()

      类似这样的:

      const selectedCompoent = Wrapper.find(exactlyComponent).first()
      

      在你的情况下:

      let datePickers = wrapper.find('.campaign-date-tab').dive().find(Datepicker).first()
      

      【讨论】:

      • 这在 React/Redux-thunk 设置中对我有用。谢谢
      【解决方案3】:

      问题: 这意味着当您查询“.campaign-date-tab”和“Datepicker”时,finder 将返回 2 个元素。我们不能一次对 2 个不同的元素执行任何事件(如点击)。

      解决方案: 无论您想访问什么元素,都让它独一无二。

      示例:设置一些属性来唯一标识一个元素

      <CampaignDateTab class="campaign-date-tab" data-test="dateTab1"/>
      

      然后像wrapper.find('[data-test="dateTab1"]')一样查询它

      同样,如果 CampaignDateTab 组件有多个 Datepicker 组件。然后你必须用一些类名或属性名等来区分它们。

      您一次只能在一个元素上模拟一个事件。查询某些元素不应返回多个元素。

      【讨论】:

      • 我找到的最佳解决方案。当发生额外的浅渲染时,他们不清理包装器似乎有点奇怪。
      • 检查,console.log(wrapper.debug())
      【解决方案4】:

      您正在执行一个 for 循环,然后使用 datePickers(数组)而不是单数 datePicker。

      你应该可以做到:

      datePickers[index].simulate('change');

      【讨论】:

      • 没用。 TypeError:无法读取未定义的属性“模拟”
      • @user3725876 这可能意味着您的 .find(...) 实际上没有找到任何东西
      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 2020-02-08
      • 2017-08-21
      • 2017-02-02
      • 2016-09-19
      • 1970-01-01
      • 2017-12-01
      • 2021-03-09
      相关资源
      最近更新 更多