gpt4 book ai didi

javascript - enzyme 测试 React.createRef()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:05 27 4
gpt4 key购买 nike

我有一个使用新的 React.createRef() api 的组件,如何测试 document.activeElement 应该等于当前的 ref 组件。

组件:

export class Automatic extends Component {
componentDidMount = () => this.focusContainer()
componentDidUpdate = () => this.focusContainer()

container = React.createRef()
focusContainer = () => this.container.current.focus()

render = () => {
return (
<div
name='automatic'
onKeyPress={this.captureInput}
onBlur={() => setTimeout(() => this.focusContainer(), 0)}
ref={this.container}
tabIndex={0}
>
...
</div>
}

旧测试(有效):

it('should focus container on mount', () => {
automatic = mount(<Automatic classes={{}} />, mountContext)

document.activeElement.should.be.equal(automatic.ref('container'))
})

新的(不起作用):

it.only('should focus container on mount', () => {
const container = React.createRef()
automatic = mount(<Automatic classes={{}} />, mountContext)

document.activeElement.should.be.equal(automatic.ref(container.current))
})

最佳答案

Updated with working examples. Added a styled-components example.

这是我用 Jest 解决它的方法(使用不同的断言,但概念是相同的):

// setup
const MyComponent = React.forwardRef((props, ref) => (
<div>
<span ref={ref}>some element</span>
</div>
))

// test
it('should contain the forwarded ref in the child span', () => {
const ref = React.createRef()
const component = mount(
<Fragment>
<MyComponent ref={ref} />
</Fragment>,
)

expect(component.find('span').instance()).toEqual(ref.current)
})
  • 想法是获取具有ref 的元素的实例。
  • 它似乎只有在将 MyComponent 包装在另一个元素中时才有效,我使用了 Fragment

我在使用 **Styled-Components 时遇到了一些麻烦。这是因为它创建了许多额外的元素。尝试使用 console.log(component.debug()) 进行调试。它会向您展示 enzyme 的作用。

调试时您会看到 Styled-Components 使用 recommended way转发 Prop 。

您可以使用 forwardedRef 的属性选择器找到正确的元素:

// setup
const El = styled.div`
color: red;
`

El.displayName = 'El'

const MyComponentWithStyledChild = React.forwardRef((props, ref) => (
<El ref={ref}>some element</El>
))

// test
it('should contain the forwarded ref in a rendered styled-component', () => {
const ref = React.createRef()
const component = mount(
<Fragment>
<MyComponentWithStyledChild ref={ref} />
</Fragment>,
)

// Styled-components sets prop `forwardedRef`
const target = component
.find('[forwardedRef]')
.childAt(0)
.instance()

expect(target).toEqual(ref.current)
})
  • 如果您创建了需要传递 ref
  • 的高阶组件 (HoC),则可以使用相同的技巧

关于javascript - enzyme 测试 React.createRef(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50720639/

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