模拟Jest中导入的函数



我有一个案例:

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".

注意:正如你看到的"today"函数在测试中以及在测试(myFunction)函数中使用,所以它必须像在应用程序中的任何地方一样返回相同的模拟值。

感谢

jest.mock()在测试用例功能范围内被调用。模块导入被提升(内部移动到当前作用域的开头)。原today函数在jest.mock()模拟utils/date模块之前导入。

您可以将jest.mock()从测试用例功能范围移动到模块范围。Jest将自动将jest.mock调用提升到模块的顶部(在任何导入之前)。因此,当您导入today函数时,它已经被模拟了。

参见使用ES模块导入:

如果您正在使用ES模块导入,那么您通常会倾向于将import语句放在测试文件的顶部。但是通常需要在模块使用mock之前指示Jest使用mock。出于这个原因,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');
});

最新更新