错误:方法“props”仅用于在单个节点上运行。 2找到了

时间:2017-10-05 05:28:34

标签: reactjs chai-enzyme

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的组件。

4 个答案:

答案 0 :(得分:12)

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

import org.apache.spark.ml.linalg._


spark.udf.register("indices", (v: Vector) => v.toSparse.indices)

val pipeline = new Pipeline().setStages(Array(
  new CountVectorizer().setInputCol("words").setOutputCol("vector"),
  new SQLTransformer()
    .setStatement("SELECT *, indices(vector) FROM __THIS__")
))

pipeline.fit(df).transform(df).show

// +---+----------------+--------------------+-------------------+
// | id|           words|              vector|UDF:indices(vector)|
// +---+----------------+--------------------+-------------------+
// |  1|[I, like, Spark]|(4,[0,1,3],[1.0,1...|          [0, 1, 3]|
// |  2|[I, hate, Spark]|(4,[0,1,2],[1.0,1...|          [0, 1, 2]|
// +---+----------------+--------------------+-------------------+

使用组件作为您正在测试的任何名称,并将索引作为您想要的数字。

答案 1 :(得分:4)

<强>问题: 这意味着当您查询&#39; .campaign-date-tab&#39;和&#39; Datepicker&#39;,finder返回2个元素。我们无法在2个不同的元素上执行任何事件(如点击)。

<强>解决方案: 您要访问的元素是什么,使其独一无二。

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

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

并查询wrapper.find('[data-test="dateTab1"]')

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

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

答案 2 :(得分:0)

你正在进行for循环,然后使用datePickers(数组)而不是单数的datePicker。

你应该可以这样做:

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

答案 3 :(得分:0)

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

类似这样的东西:

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

在您的情况下:

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