Pull to refresh

Comments 11

Расскажите, пожалуйста, как вы тестируете подобные компоненты? В нашей компании мы тоже решили переходить на хуки и столкнулись с проблемой того, что компонент надо заворачивать в redux-провайдер, что не всегда удобно. С react connect + компонент, принимающий св-ва такой проблемы нет.

переходить на хуки и столкнулись с проблемой того, что компонент надо заворачивать в redux-провайдер

Честно говоря не понял. Вы хотите сказать, что переписываете текущее приложение с Redux на хуки и т.к. делаете это итеративно — появляется необходимость синхронизировать хранилище Redux с новым кастомным reducer'ом?

Да, и это тоже. Но я имел в виду то, что приходится тестировать все вместе вместо того, чтобы протестировать только функционал компонента.

Я так стал делать.


const MyComponent = ({ useFetch }) => {
  const data = useFetch(...);
  // ...
}

MyComponent.defaultProps = {
  useFetch,
};

// test
const useFetch = jest.fn(() => []);
const tree = renderer(<MyComponent useFetch={useFetch} />);

Если не нравится defaultProps, то jest.mock. Но тогда тест неявно знает, что внутри кода, а так явно.

Не могли бы Вы пояснять, что происходит в данном примере? Почему стрелочная функция просто «висит» внутри onClick? Попытался скопировать данный код в IDE и насчитал минимум 4 синтаксических ошибки.
Код
...
return (
            // Теперь мы хотим обновить данные внутри дерева
            // для этого нам нужно как-то получить самое актуальное состояние
            // этого дерева в момент вызова экшена, можно сделать это через callback:
            <div onClick={() => {
            // Сделаем так, чтобы экшен возвращал callback, 
            // который внутри testReducer будет передавать самый актуальный state
             (state) => {
             const {tree_1} = state;

             return {
                tree_1: {
                    ...tree_1,
                    tree_2_1: {
                        ...tree_1.tree_2_1,
                        tree_3_1: 'tree_3_1 UPDATE'
                    },
                },
            };
            }>
                {JSON.stringify(state)}
            </div>
    )
...


В этом примере "происходит" самый обычный обработчик события на JSX, только закрывающую фигурную скобку автор забыл.

Очень странно, я не писал этот комментарий) И вообще не читал эту статью. Почему комментарий оказался здесь от моего имени - не понимаю

Кажется, это мой комментарий 4-летний давности. Почему-то отображается, что был добавлен 52 минуты назад. Раз уж я тут - перечитал код. Тут не хватает двух фигурных скобок, а самое главное - та самая "висящая" стрелочная функция не обёрнута в dispatch:

Код
return (
		// Теперь мы хотим обновить данные внутри дерева
		// для этого нам нужно как-то получить самое актуальное состояние
		// этого дерева в момент вызова экшена, можно сделать это через callback:
		<div
			onClick={() => {
				// Сделаем так, чтобы экшен возвращал callback,
				// который внутри testReducer будет передавать самый актуальный state
				dispatch(state => {
					const { tree_1 } = state;

					return {
						tree_1: {
							...tree_1,
							tree_2_1: {
								...tree_1.tree_2_1,
								tree_3_1: `tree_3_1 UPDATE`,
							},
						},
					};
				});
			}}
		>
			{JSON.stringify(state)}
		</div>
	);

Sign up to leave a comment.

Articles