如何Mock模块中的指定函数?针对模块导入场景的问询
好的,这个问题得看你用的是CommonJS还是ES模块语法导入,以及你用的测试框架(比如Jest、Vitest这类主流工具)。我拿最常用的Jest来举例子,分两种核心导入场景给你讲清楚怎么Mock bestFunction:
场景1:CommonJS 导入(require语法)
如果你的业务代码是用require导入的,比如:
// 业务代码文件 const { bestFunction } = require('./module.js');
那在测试文件里,你可以直接用jest.mock来整个Mock模块,或者单独MockbestFunction:
方式1:完全Mock模块
// 测试文件 jest.mock('./module.js', () => ({ // 把bestFunction替换成一个Mock函数,自定义返回值 bestFunction: jest.fn(() => '我是Mock出来的结果') })); // 导入模块(此时导入的就是Mock后的版本) const { bestFunction } = require('./module.js'); test('验证bestFunction被调用并返回Mock值', () => { const result = bestFunction(); expect(bestFunction).toHaveBeenCalled(); // 检查是否被调用 expect(result).toBe('我是Mock出来的结果'); // 检查返回值 });
方式2:只Mock bestFunction,保留模块其他方法
如果你不想Mock整个模块,只想替换bestFunction,保留其他方法的原有逻辑,可以这么做:
// 测试文件 jest.mock('./module.js', () => { // 先拿到模块的原始实现 const originalModule = jest.requireActual('./module.js'); return { ...originalModule, // 保留其他方法 bestFunction: jest.fn(() => '仅Mock这个方法的返回值') }; }); const { bestFunction } = require('./module.js');
场景2:ES模块导入(import语法)
如果业务代码用的是ES模块的import语法,比如:
// 业务代码文件 import { bestFunction } from './module.js';
Mock的时候要注意加上__esModule: true,告诉测试框架这是一个ES模块:
方式1:完全Mock模块
// 测试文件顶部先导入,再Mock import { bestFunction } from './module.js'; jest.mock('./module.js', () => ({ __esModule: true, // 必须加这个标识 bestFunction: jest.fn(() => 'ES模块下的Mock结果') })); test('测试ES模块下的Mock', () => { bestFunction(); expect(bestFunction).toHaveBeenCalledTimes(1); // 检查调用次数 });
方式2:部分Mock(仅替换bestFunction)
和CommonJS的逻辑类似,只是要注意ES模块的标识:
import { bestFunction } from './module.js'; jest.mock('./module.js', () => { const originalModule = jest.requireActual('./module.js'); return { __esModule: true, ...originalModule, bestFunction: jest.fn(() => '仅Mock这个方法') }; });
补充:其他测试框架(比如Vitest)
如果用的是Vitest,逻辑几乎和Jest一致,只是把jest换成vi就行,比如vi.mock、vi.fn,示例:
import { bestFunction } from './module.js'; import { vi, test, expect } from 'vitest'; vi.mock('./module.js', () => ({ __esModule: true, bestFunction: vi.fn(() => 'Vitest的Mock结果') })); test('Vitest下的Mock测试', () => { bestFunction(); expect(bestFunction).toHaveBeenCalled(); });
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

