如何测试React组件是否正在侦听窗口事件

时间:2016-06-03 02:38:35

标签: unit-testing reactjs mocha sinon

示例:

我有一个React Component,List

class List extends React.Component {
  static propTypes {
    onFocusChange: PropTypes.func.isRequired
  }

  componentDidMount() {
    window.addEventListener('keydown', this._handleFocusChange);
  }

  componentWillUnmount() {
    window.removeEventListener('keydown', this._handleFocusChange);
  }

  @autobind
  _handleFocusChange(e) {
    if (e.which === 38) {
      const someValue = populateThisValue();
      this.props.onFocusChange(someValue);
    }
  }
}

现在在相应的测试文件中,我使用React Test Utils sinon spy来模拟作为prop传入的onFocusChange函数:

test('onFocusChange should be called when up arrow key is clicked', () => {
      const onFocusChange = sinon.stub();
      ReactTestUtils.renderIntoDocument(
        <List
          onFocusChange={onFocusChange}
        />
      );
      ReactTestUtils.Simulate.keyDown(window, { which: 38 });
      assert.isTrue(onFocusChange.calledOnce);
      assert.isTrue(onFocusChange.calledWith(0));
    });

但遗憾的是onFocusChange没有被调用。我最初怀疑componentDidMount()没有被调用但是我检查了它。

我的猜测是List对窗口的引用与测试中使用的引用不同。

我不完全确定React TestUtils上的renderIntoDocument()函数是如何实际渲染组件的,以及它是否被渲染到window.document.body中。

任何人都可以帮我吗?

0 个答案:

没有答案