Jest шпионит за проблемой внешней функции

#reactjs #jestjs

#reactjs #jestjs

Вопрос:

По какой-то причине я получаю эту ошибку:

 Cannot spy the handleError property because it is not a function; undefined given instead
  

Я использую шпионский метод…

 const spyHandleError = jest.spyOn(handleError, 'handleError');
  

…чтобы проверить, была ли вызвана функция HandleError:

 expect(spyHandleError).toHaveBeenCalled();
  

Моя функция HandleError выглядит так:

 import { reduxAction } from '../store/actions/auth';

export const handleError = (status, dispatch) => {
  if(status === 403) {
    return dispatch(reduxAction());
  }
};
  

Почему я получаю эту ошибку и как я могу использовать метод spyOn для ее проверки?

Комментарии:

1. Не могли бы вы предоставить полный тестовый пример? Это помогло бы понять, что вы хотите протестировать.

Ответ №1:

При вызове метода jest.spyOn вы должны предоставить в качестве первого аргумента объект, содержащий метод, который вы хотите шпионить (документация).

Вероятно, вы импортируете метод HandleError, например:

 import { handleError } from 'file-where-handle-error-is';
  

Следовательно, ваш импортированный HandleError является непосредственно функцией, а не объектом, который содержит функцию.

Чтобы решить вашу проблему, вы можете импортировать модуль, в котором находится HandleError, а затем имитировать метод HandleError:

 const utils = require('file-where-handle-error-is');
const spyHandleError = jest.spyOn(utils, 'handleError');
  

Другим решением было бы смоделировать модуль, в котором находится HandleError, с помощью jest.mock:

 jest.mock('../../../src/utils/handle-error', () => {
return {
    handleError: jest.fn()
};
  

Ответ №2:

Если вы хотите шпионить за функцией, экспортируемой из файла, который содержит много других функций (например, вспомогательный файл), вы можете импортировать все функции как объект, например, так:

 import * as errorHelpers from 'path/to/errorHelpers';
  

Затем вы можете настроить свой шпион следующим образом:

 const spyHandleError = jest.spyOn(errorHelpers, 'handleError');