【发布时间】:2017-12-16 05:38:41
【问题描述】:
使用来自this answer 的代码来解决在组件外点击的问题:
componentDidMount() {
document.addEventListener('mousedown', this.handleClickOutside);
}
componentWillUnmount() {
document.removeEventListener('mousedown', this.handleClickOutside);
}
setWrapperRef(node) {
this.wrapperRef = node;
}
handleClickOutside(event) {
if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {
this.props.actions.something() // Eg. closes modal
}
}
我不知道如何对不愉快的路径进行单元测试,这样警报就不会运行,到目前为止我得到了什么:
it('Handles click outside of component', () => {
props = {
actions: {
something: jest.fn(),
}
}
const wrapper = mount(
<Component {... props} />,
)
expect(props.actions.something.mock.calls.length).toBe(0)
// Happy path should trigger mock
wrapper.instance().handleClick({
target: 'outside',
})
expect(props.actions.something.mock.calls.length).toBe(1) //true
// Unhappy path should not trigger mock here ???
expect(props.actions.something.mock.calls.length).toBe(1)
})
我试过了:
- 通过
wrapper.html()发送 -
.find一个节点并通过发送(不模拟event.target) -
.simulateingclick在内部元素上(不触发事件监听器)
我确定我遗漏了一些小东西,但我在任何地方都找不到这样的例子。
【问题讨论】:
-
您可能想尝试更改“外部点击”检测逻辑以处理组件的某些根元素上的 onBlur 事件:gist.github.com/pstoica/4323d3e6e37e8a23dd59
-
虽然选择的答案是正确的,但我最终将此逻辑卸载到 react-onclickoutside 库 - github.com/Pomax/react-onclickoutside
标签: javascript unit-testing reactjs jestjs enzyme