@senchkim
Junior Frontend

Как верно покрыть тестами хук реактовский?

Всем привет,
Есть такой хук
import { useRef, useEffect } from 'react';

export const useTimeout = (callback: () => unknown, delay: number, dependencies: unknown[]) => {
  const timeoutRef = useRef<number>();
  const savedCallback = useRef(callback);

  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  useEffect(() => {
    const tick = () => savedCallback.current();
    timeoutRef.current = window.setTimeout(tick, delay);
    return () => window.clearTimeout(timeoutRef.current);
  }, [delay, ...dependencies]);

  return timeoutRef;
};


Написал следующий тест:
import { renderHook } from '@testing-library/react';
import { useTimeout } from './useTimeout';

describe('hooks/useTimeout', () => {
  it('returns useTimeout', () => {
    const {result} = renderHook(() => useTimeout(() => false, 500, []));
    expect(result.current).toBe(5);
  });
});


Но он падает:
6661a89f4b379957660464.jpeg
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега React
- expect(result.current).toBe(5);
+ expect(result.current.current).toBe(5);

Функция renderHook возвращает объект, в котором в свойстве result содержится объект, в котором в свойстве current хранится результат вызова хука. Результат вызова вашего хука - ref, который тоже является объектом со свойством current, содержащим id интервала.

Вроде, сообщение об ошибке максимально понятное ¯\_(ツ)_/¯
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
24 нояб. 2024, в 21:55
200000 руб./за проект
24 нояб. 2024, в 21:41
1000 руб./за проект
24 нояб. 2024, в 21:19
35000 руб./за проект