gpt4 book ai didi

javascript - 单元测试 React 点击外部组件

转载 作者:行者123 更新时间:2023-12-03 13:05:44 27 4
gpt4 key购买 nike

使用 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()发送
  • .查找节点并发送(不模拟 event.target)
  • .simulateclick 内部元素(不会触发事件监听器)

我确信我错过了一些小东西,但我在任何地方都找不到这样的例子。

最佳答案

import { mount } from 'enzyme'
import React from 'react'
import ReactDOM from 'react-dom'

it('Should not call action on click inside the component', () => {
const map = {}

document.addEventListener = jest.fn((event, cb) => {
map[event] = cb
})

const props = {
actions: {
something: jest.fn(),
}
}

const wrapper = mount(<Component {... props} />)

map.mousedown({
target: ReactDOM.findDOMNode(wrapper.instance()),
})

expect(props.actions.something).not.toHaveBeenCalled()
})

来自this的解决方案github 上的 enzyme 问题。

关于javascript - 单元测试 React 点击外部组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45046728/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com