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

使用Jest模拟含数据库调用的方法时遇到问题求助

解决Jest无法模拟内部函数导致触发数据库调用的问题

问题根源

你当前的测试代码无效的核心原因:getData是和generateResult同级的独立函数,并非generateResult的属性,所以jest.spyOn(generateResult, 'getData')找不到目标函数,模拟完全未生效,测试依然执行了真实的getData逻辑,触发了数据库调用。

解决方案

以下是几种可行的修复方式,根据你的代码结构选择:

方案1:导出getData并模拟导出的函数

首先修改业务代码,将getData和generateResult一同导出:

// 业务模块代码
export const getData = async (...args) => {
    await db.getData();
    await db.queryData();
    return data;
}

export const generateResult = async (...args) => {
    const data = await getData(...args);
    // 后续数据处理逻辑
    return result;
}

export class ClassTest {}

然后调整测试代码,模拟模块中导出的getData:

// 测试文件
import * as businessModule from './path-to-your-business-module';

describe('Verify generateResult', () => {
    it('should return result', async () => {
        // 定义测试用的模拟数据
        const mockData = { id: 1, content: 'test data' };
        // 模拟异步的getData函数,返回预设数据
        jest.spyOn(businessModule, 'getData').mockResolvedValue(mockData);

        const result = await businessModule.generateResult(...args);
        expect(result).toBeTruthy();

        // 可选:验证getData是否被正确调用
        expect(businessModule.getData).toHaveBeenCalledWith(...args);
    });
});

方案2:将函数封装到模块对象中(无需额外导出私有函数)

如果不想暴露getData,可以把相关函数封装到一个对象里,让generateResult调用对象内部的getData:

// 业务模块代码
const businessService = {
    getData: async (...args) => {
        await db.getData();
        await db.queryData();
        return data;
    },
    generateResult: async (...args) => {
        const data = await businessService.getData(...args);
        // 后续数据处理逻辑
        return result;
    }
};

export { businessService };
export class ClassTest {}

测试代码修改为:

// 测试文件
import { businessService } from './path-to-your-business-module';

describe('Verify generateResult', () => {
    it('should return result', async () => {
        const mockData = { id: 1, content: 'test data' };
        jest.spyOn(businessService, 'getData').mockResolvedValue(mockData);

        const result = await businessService.generateResult(...args);
        expect(result).toBeTruthy();
    });
});

关键注意点

  • 因为getData是异步函数,模拟时必须使用mockResolvedValue(返回resolved状态的Promise),不能直接返回原始值,否则会导致generateResult中await getData(...)拿到的不是预期数据。
  • 测试完成后,可通过mockRestore()清除模拟,避免影响其他测试用例:
    afterEach(() => {
        jest.restoreAllMocks();
    });
    

内容的提问来源于stack exchange,提问作者Ashy Ashcsi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:35:21