【问题标题】:Test setting text value with React and Enzyme使用 React 和 Enzyme 测试设置文本值
【发布时间】:2017-06-03 14:13:50
【问题描述】:

如何设置文本输入的文本,然后用 React / Enzyme 测试它的值?

const input = wrapper.find('#my-input');

input.simulate('change',
  { target: { value: 'abc' } }
);

const val = input.node.value;

//val is ''

所有solutions here 似乎都不起作用..

【问题讨论】:

标签: javascript reactjs testing enzyme


【解决方案1】:

如果使用 TypeScript,您可以执行以下操作

wrapper.find('input').getDOMNode<HTMLInputElement>().value = 'new value';
wrapper.find('input').simulate('change');

【讨论】:

    【解决方案2】:

    这对我有用..

    我已经更改了输入文本,并更新了值。 并更新我的 DOM 属性

    .update()
    

    更新后,我正在检查带有输入手机号码长度用例的按钮禁用属性。

    const input = MobileNumberComponent.find('input')
    input.props().onChange({target: {
       id: 'mobile-no',
       value: '1234567900'
    }});
    MobileNumberComponent.update()
    const Footer = (loginComponent.find('Footer'))
    expect(Footer.find('Buttons').props().disabled).equals(false)
    

    【讨论】:

      【解决方案3】:

      这适用于酶 3 和酶 2:

      wrapper.find('input').getDOMNode().value = 'new value';
      wrapper.find('input').simulate('change');
      

      .getDOMNode() 可以像 Enzyme 2 中的 .node 和 Enzyme 3 中的 .instance() 一样使用。

      【讨论】:

      【解决方案4】:

      我在这里使用React 16Enzyme 3.10,这完全适合我(在尝试了太多不同的建议之后):

      wrapper.find("input").instance().value = "abc";
      

      显然,在以前的版本中,您可以使用nodegetNode() 代替instance(),这是我之前许多尝试的一部分。

      【讨论】:

      • 我使用了.node,但酶告诉我使用getElement(),但这给了我反应元素而不是dom元素。感谢分享instance() 功能。
      • typescript 失败并出现错误:TS2339: Property value does not exist on type Component&lt;{}, {}&gt;。你能帮忙吗?
      • @user2133404 抱歉,伙计……但我不知道如何解决这个问题,因为我以前从未使用过 Typescript。
      • Typescript 需要知道你具体处理的是什么类型的元素。在这种情况下,wrapper.find("input").instance&lt;HTMLInputElement&gt;().value = "abc"; 可以工作。
      【解决方案5】:

      要真正了解您的代码中发生了什么,查看您的组件代码(特别是您的 onChange 处理程序)会很有用。

      但是,关于以下代码:

      input.simulate('change', {target: {value: 'abc'}});
      

      这实际上不会更改您的 &lt;input /&gt; 元素的值,而只会导致您的 onChange 函数运行并提供一个看起来像 {target: {value: 'abc'}} 的事件对象。

      这个想法是你的onChange 函数会更新你的状态或存储,所以触发这个函数应该会导致你的 DOM 被更新。如果您实际上没有使用input.simulate('change') 定义的onChange 处理程序,则不会执行任何操作。

      所以,如果您的目标是实际设置输入的值而不是触发 onChange 处理程序,那么您可以使用 JS 手动更新 DOM,使用类似 wrapper.find('#my-input').node.value = 'abc'; 的东西,但是这绕过了 React 的渲染周期,您'如果你做任何事情来触发重新渲染,可能会看到这个值被清除/删除。

      【讨论】:

      • 我正在尝试使用input.node.value = "Test" 设置值,我收到此错误TypeError: Can't add property value, object is not extensible。有什么想法吗?
      • @jhamm 在下面查看我的答案。
      • 您可能需要删除目标/值:input.simulate('changeText', '6');
      • 我也遇到了以下问题:TypeError: Cannot add property value, object is not extensible。为我解决的问题是将 node.find('#id_name').get(0).value = 更改为 node.find('#id_name').instance().value =
      猜你喜欢
      • 2017-11-26
      • 2017-11-10
      • 2020-08-07
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多