Редактировать: теперь это исправлено, но я не уверен почему. Пожалуйста, просмотрите этот оригинальный пост и мое дополнительное редактирование ниже, я был бы признателен за отзыв о том, почему это сейчас работает.
Итак, я новичок в React Hooks. Я использую хук useEffect () в компоненте, и этот хук вызывает функцию searchForVideos () из моего реквизита:
useEffect(() => {
props.searchForVideos();
}, [currentPage]);
Эта функция проверяется в моих модульных тестах с использованием Jest:
const searchForVideos = jest.fn();
Итак, насколько я понимаю, useEffect () должен запускаться в первый раз сразу после рендеринга компонента. Я могу поместить оператор console.log () в обратный вызов useEffect (), и он будет печатать на консоль. Однако это ожидание () не выполняется:
const component = mountComponent();
setImmediate(() => {
expect(searchForVideos).toHaveBeenCalled();
done();
});
Это странно, потому что я подтвердил, что хук работает, и если он работает, он должен вызвать функцию. Однако эта строка всегда терпит неудачу.
Есть ли что-то, что я должен знать о том, чтобы заставить смоделированные функции хорошо работать с перехватчиками React?
Редактировать: в ответ на комментарий я внес изменение, которое устранило проблему. Я не понимаю, почему это сработало.
const component = mountComponent();
requestAnimationFrame(() => {
expect(searchForVideos).toHaveBeenCalled();
done();
});
Так что я просто заменил setImmediate () на requestAnimationFrame (), и теперь все работает. Я никогда не трогал requestAnimationFrame () раньше. Насколько я понимаю, setImmediate () может заключаться в том, что он сразу же ставит в очередь обратный вызов в конце очереди событий, поэтому любые другие задачи JavaScript в очереди будут выполняться до него.
Так что я надеюсь, что кто-то мог бы лучше объяснить мне эти функции и почему это изменение сработало. Спасибо.