Имитация импортированной функции в шутку

#javascript #reactjs #unit-testing #jestjs

Вопрос:

У меня есть дело:

test.js

 import { today } from "utils/date";
import myFunction from "helpers/myFunction";

it('should work properly', () => {
   jest.mock('utils/date', () => ({
      ...(jest.requireActual('utils/date')),
      today: jest.fn(() => '01-01-2020'),
   }));

   console.log(today()); // still logs current date 14-10-2021, not the mocked date       

   expect(myFunction()).toEqual(today());
});
 

myFunction.js

 import { today } from "utils/date";

export const myFunction = () => today();
 

today это функция, которая возвращает сегодняшнюю дату. Но для целей тестирования мне нужна эта функция, чтобы всегда возвращать одну и ту же дату, например "01-01-2020" .

Примечание: как вы можете видеть, функция «сегодня» используется как в тесте, так и внутри тестируемой функции (myFunction), поэтому она должна возвращать то же значение, что и везде в приложении.

Спасибо

Ответ №1:

jest.mock() вызывается в функциональной области тестового набора. Импорт модулей перемещается (внутренне перемещается в начало текущей области). Исходная today функция импортируется до jest.mock() того, как будет издеваться над utils/date модулем.

Вы можете переместить jest.mock() функциональную область из тестового набора в область модуля. Jest автоматически поднимет jest.mock вызовы в верхнюю часть модуля (перед любым импортом). Так что, когда вы импортируете today функцию, над ней уже издеваются.

См. раздел Использование с импортом модулей ES:

Если вы используете импорт модулей ES, то обычно вы склонны помещать свои import утверждения в начало тестового файла. Но часто вам нужно проинструктировать Jest использовать макет, прежде чем модули будут его использовать. По этой причине Jest автоматически поднимет jest.mock вызовы в верхнюю часть модуля (перед любым импортом).

 import { today } from 'utils/date';

jest.mock('utils/date', () => ({
  today: jest.fn(() => '01-01-2020'),
}));

it('should work properly', () => {
  expect(jest.isMockFunction(today)).toBeTruthy();
  expect(today()).toBe('01-01-2020');
});