Рекомендуемый подход к тестированию компонентов с использованием react-beautiful-dndеще не определено. Однако это меня несколько блокирует.
Я могу протестировать свои компоненты с помощью react-beautiful-dnd, обернув их в DragDropContext согласно эта рекомендация:
import React from 'react'
import {render} from 'react-testing-library'
import {DragDropContext} from 'react-beautiful-dnd'
import List from '../List'
describe('List', () => {
it('renders', () => {
const title = 'title'
const {container, getByText} = render(
<DragDropContext onDragEnd = {() => {}}>
<List>
<li>{title}</li>
</List>
</DragDropContext>
)
expect(container.firstChild).toBeInTheDocument()
expect(getByText(title)).toBeInTheDocument()
})
})
Однако это кажется неоптимальным подходом. Вместо этого я хотел бы поиздеваться над react-beautiful-dnd, но не могу понять, как это сделать правильно.
Скажем, если мой компонент List завернут в Droppable следующим образом:
return (
<Droppable droppableId='id'>
{provided =>
<ListContainer
ref = {provided.innerRef}
{...provided.droppableProps}
>
{children}
{provided.placeholder}
</ListContainer>
}
</Droppable>
)
как мне написать макет для компонента, используя подход render prop (который делает Droppable)?
jest.mock('react-beautiful-dnd', () => ({
Droppable: props => props.children()
}))
Вышесказанное будет работать для higher-order component. Как сделать так, чтобы он работал с компонентом, реализующим render prop?
Привет @HermanStarikov. Дело в том, что опора рендеринга должна быть функцией, которая содержит аргумент provided, поскольку он затем предоставит реквизиты для children. Если я запустил код как есть, я получаю сообщение об ошибке: Warning: React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.





Мне удалось смоделировать react-beautiful-dnd для нашей библиотеки, реализовав следующее:
jest.mock('react-beautiful-dnd', () => ({
Droppable: ({ children }) => children({
draggableProps: {
style: {},
},
innerRef: jest.fn(),
}, {}),
Draggable: ({ children }) => children({
draggableProps: {
style: {},
},
innerRef: jest.fn(),
}, {}),
DragDropContext: ({ children }) => children,
}));
Я, наверное, что-то неправильно понял, но не понимаю, почему ваш макет не работает. Думаю, в
hocвы бы вернулиprops.childrenиз макета, а вrender propэтоprops.children()