在React中测试按钮的禁用状态

时间:2016-01-27 12:30:12

标签: javascript unit-testing reactjs

我有一个简单的组件,我想使用React和ReactUtils进行测试。

var TextConfirmButton = React.createClass({
  getInitialState: function() {
    return {
      inputText: '',
      confirmText: this.props.confirmText,
      buttonEnabled: false,
      inputEnabled: true
    }
  },

  handleChange: function(event) {
    this.setState({ inputText: event.target.value });
  },

  handleConfirm: function() {
    this.props.onConfirmClick();
    // When user clicks the confirm button, disable both the input and button.
    this.setState({ buttonEnabled: false, inputEnabled: false });
  },

  render: function() {
    return (
      <div>
        <input onChange={this.handleChange} disabled={!this.state.inputEnabled} type='text' ref='text' placeholder={this.state.confirmText} />
        <button onClick={this.handleConfirm} disabled={this.state.inputText !== this.state.confirmText} className='btn btn-danger'>Delete</button>
      </div>
    )
  }
})

有没有办法测试按钮的禁用状态?

我尝试过:

var TestUtils = React.addons.TestUtils;

describe('TextConfirmButton', function () {
  it('starts with confirm button disabled', function () {
    var onConfirmClick = function() {
      console.log("Confirm click");
    }

    var textConfirmButton = TestUtils.renderIntoDocument(
      <TextConfirmButton confirmText="example" onConfirmClick={this.onConfirmClick} />
    );

    var textConfirmButtonNode = ReactDOM.findDOMNode(textConfirmButton);

    expect(textConfirmButtonNode.disabled).toEqual('disabled');
  });
});

但测试失败,错误为:textConfirmButtonNode.disabled undefined。所以.disabled显然是错误的做法。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

您需要使用TestUtils#findRenderedDOMComponentWithTag才能查询TestUtils生成的DOM。

var textConfirmButtonNode = 
TestUtils.findRenderedDOMComponentWithTag(textConfirmButton, 'button');

expect(textConfirmButtonNode.disabled).toEqual(true);

答案 1 :(得分:1)

textConfirmButtonNode引用div函数中最外层的render()。除非它具有disabled的属性,否则返回未定义并不令人惊讶。

我的猜测是你正在寻找一个引用实际button的DOM节点。

var textConfirmButtonNode = ReactDOM.findDOMNode(textConfirmButton);
var renderedButtonNode = textConfirmButtonNode.childNodes[1];

expect(renderedButtonNode.disabled).toEqual('disabled');