我有一个commponent,我使用新的weight
api,如何测试React.create()
应该是当前的ref参与者。
组件:
document.activeElement
旧测试(工作):
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'))
})
答案 0 :(得分:4)
已更新了工作示例。添加了样式组件示例。
这是我用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
。使用**样式化组件时遇到麻烦。这是因为它创建了许多额外的元素。尝试使用console.log(component.debug())
进行调试。它会告诉你酶的作用。
调试时,您会看到样式化组件使用recommended way来转发道具。
您可以使用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),则可以使用相同的技巧答案 1 :(得分:0)
it('should focus container on mount', () => {
automatic = mount(<Automatic classes={{}} />, mountContext)
document.activeElement.should.be.equal(automatic.instance().container.current)
})