示例:
我有一个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中。
任何人都可以帮我吗?