Модульное тестирование пользовательских перехватов реакции в TypeScript с использованием Jest и @testing-library/react-hooks

#javascript #reactjs #typescript #react-hooks #jestjs

Вопрос:

У меня есть пользовательский перехват, который принимает идентификатор продукта и переключается с value (boolean) помощью и toggle в качестве возврата. Я пытаюсь написать для него модульный тест, следуя приведенному здесь примеру, но я получаю ошибки несоответствия типов TypeScript (пример, который я следую, не написан на машинке).

Пользовательский перехват:

 export default function useToggle(id: number): [boolean, () => void] {
  const [value, setValue] = React.useState(false);

  useEffect(() => {
    try {
      const data = localStorage.getItem(ITEMS);
      const all = data ? JSON.parse(data) : {};
      setValue(!!all[id]);
    } catch (error) {
      console.error('items localStorage get error', error);
      setValue(false);
      localStorage.removeItem(ITEMS);
    }
  }, [id]);

  function toggle() {
    try {
      const data = localStorage.getItem(ITEMS);
      const all = data ? JSON?.parse(data) : {};
      all[id] = !all[id];
      localStorage.setItem(ITEMS, JSON.stringify(all));

      setValue(v => !v);
    } catch (error) {
      console.error('items localStorage set error', error);
    }
  }

  return [value, toggle];
}
 

Тест выполняется:

 
describe('useToggle', () => {
  it('returns value and toggle', () => {
    const { result } = renderHook(() => useToggle(1));
    const { value, toggle }: [boolean, () => void] = result.current;

    expect(value).toBe(false);
    expect(setValue).toBeDefined();

  });
});
 

Ошибка:
Где я определяю value и toggle , я получаю Property 'value' does not exist on type '[boolean, () => void]'. и Property 'toggle' does not exist on type '[boolean, () => void]'.

Я неправильно настраиваю определение типа или что-то еще идет не так? Любые рекомендации будут оценены. Спасибо!

Ответ №1:

Вы возвращаете массив. Для этого вы должны уничтожить using [ value, toggleLike, toggleLike] и not { value, toggleLike} .

 
describe('useLikes', () => {
  it('returns value and toggleLike', () => {
    const { result } = renderHook(() => useLikes(1));
    const [ value, toggleLike ]: [boolean, () => void] = result.current;

    expect(value).toBe(false);
    expect(setValue).toBeDefined();

  });
});