You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:46:51