如何模拟另一个函数返回对象中的output.b函数?
如何模拟
output.b函数 现有代码文件
main.js
import { a } from './a.js'; const { output } = a(); const c = num => num + output.b(); export { c }
a.js
const a = () => ({ output: { b: () => 5 }, // 需要模拟的函数 }); export { a }
初始测试文件 main.test.js
import { c } from './main.js'; describe('main file', () => { test("c function", () => { const result = c(4); expect(result).toBe(9); }); })
解决方案(以Jest为例)
由于main.js在导入阶段就执行了a()并获取output,必须在导入main.js之前完成对a.js模块的Mock,确保a()返回的是我们预设的模拟对象。
修改后的测试文件如下:
// 提前Mock a.js模块,覆盖原导出 jest.mock('./a.js', () => ({ a: jest.fn(() => ({ output: { b: jest.fn(() => 10) // 自定义模拟返回值 } })) })); // 此时导入main.js,会使用Mock后的a函数 import { c } from './main.js'; describe('main file', () => { test("c function uses mocked output.b", () => { const result = c(4); expect(result).toBe(14); // 4 + 模拟的10 =14 // 验证output.b是否被调用 const { a } = require('./a.js'); const mockOutput = a(); expect(mockOutput.b).toHaveBeenCalled(); }); test("c function with different mock value", () => { const { a } = require('./a.js'); // 重置Mock并设置新的返回值 a.mockReturnValue({ output: { b: jest.fn(() => 3) } }); const result = c(4); expect(result).toBe(7); //4+3=7 }); })
关键说明
jest.mock会在模块导入前生效,确保main.js执行a()时拿到的是模拟对象。- 可以在不同测试用例中通过
mockReturnValue重置Mock,实现多场景测试。 - 若使用Vitest等其他测试框架,仅需将
jest替换为vi即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Dmitry Grinko
相关产品推荐
相关产品推荐

