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

如何模拟另一个函数返回对象中的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:35:20