【问题标题】:React unit-test won't update <input> valueReact 单元测试不会更新 <input> 值
【发布时间】:2016-01-26 21:43:15
【问题描述】:

更新:为此@React: <input> value never updated in unit test创建了一个新的、更清晰的问题


我有一个类似这样的 React 组件:

var Example = React.createClass({
  render: function() {
    return <input type="text"
      onChange  = {this.props.onChange}
      value     = {this.props.text}
      data-what = {this.props.text} />;
  }
});

我有一个单元测试,我这样做:

  1. 使用TestUtils.renderIntoDocument 创建组件,使用“FIRST”作为state.text
  2. 使用Simulate.change 将文本更改为“SECOND”。

这是最奇怪的事情。如果我在每一步之后转储 HTML,我希望看到:

<input type="text" data-what="FIRST" value="FIRST">
<input type="text" data-what="SECOND" value="SECOND">

……但出于某种奇怪的原因,我不断得到以下结果:

<input type="text" data-what="FIRST" value="FIRST">
<input type="text" data-what="SECOND" value="FIRST">

在第二次转储中,value 仍然是“FIRST”。什么??

很明显管道正在工作,因为data-what 已正确更改为“SECOND”,但为什么不是该值?很困惑。

【问题讨论】:

  • 你能发布你组件的onChange方法吗?我怀疑您希望 this.text 成为 this.state.text 而不是设置 this.text 您应该调用 this.setState({text: 'text'})
  • 什么是this.text?应该是 props 还是 state?
  • 哦,我的错,我真笨。这是this.props.text - 我现在会更新。

标签: unit-testing reactjs


【解决方案1】:

这是因为您使用的是Controlled Component

带有value 集的&lt;input&gt; 是一个受控组件。在受控的&lt;input&gt; 中,渲染元素的值将始终反映value 属性。

这意味着如果要更改文本,则必须更改提供给&lt;input&gt;value 属性。更改事件不会更改值,用户也无法这样做。

我怀疑您正在寻找的是 defaultValue 道具。

  render: function() {
    return <input type="text"
      onChange     = {this.onChange}
      defaultValue = {this.text}
      data-what    = {this.text} />;
  }

【讨论】:

  • 我在初始代码sn-p中犯了一个错误。我现在更新它以显示.text.onChange 都来自props。所以它是value={this.props.value} 和我的this.props.onChange 更新上游状态,然后更改下一个{this.props.value}。它在浏览器中运行良好,没有警告。只是单元测试有这种奇怪的行为。
  • 如果您完整地发布了失败的单元测试,这可能会有所帮助。
  • 同意。我为此创建了一个小提琴并将其放入一个新问题@@stackoverflow.com/q/35073662/1846272
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2016-08-07
  • 2014-07-07
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多