Издевательство над react-beautiful-dnd с помощью Jest

Рекомендуемый подход к тестированию компонентов с использованием 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?

Я, наверное, что-то неправильно понял, но не понимаю, почему ваш макет не работает. Думаю, в hoc вы бы вернули props.children из макета, а в render prop это props.children()

Herman Starikov 22.11.2018 18:07

Привет @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.

artooras 30.11.2018 13:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
2
3 393
1

Ответы 1

Мне удалось смоделировать 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,
}));

Другие вопросы по теме