Обновлено с рабочими примерами.Добавлен пример стилевых компонентов.
Вот как я решил это с помощью 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())
.Он покажет вам, какой фермент рендерит.
При отладке вы увидите, что Styled-Components использует рекомендуемый способ для пересылки реквизита.
Вы можете найти нужный элементиспользуя селектор свойств для 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)
})
- Вы можете использовать тот же трюк, если создали компонент высшего порядка (HoC), где вам нужно передать
ref