#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');
});