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

如何使用Jest Mock MongoDB的mongoClient 解决db()不是函数报错

错误原因
  • 你的mock逻辑完全不符合DBManager的实际结构:DBManager.start是无业务返回值的异步方法,作用仅为初始化私有属性_connection,你错误的给它设置了返回函数
  • connection是类的getter属性而非函数,它的返回值就是内部的_connection,你将其定义为mock函数属于结构错误
  • db()是挂载在connection返回的MongoClient实例上的方法,和connection不是平级关系
修复方案

方案1:直接修改DBManager实例属性(快速适配现有写法)

直接给DBManager的内部属性赋值,跳过真实的连接逻辑:

// 构造mock的MongoClient实例,挂载db方法
const mockMongoClient = {
  db: jest.fn().mockReturnValue({ success: true })
};
// 直接给私有属性_connection赋值,对应getter connection的返回值
DBManager._connection = mockMongoClient;
// mock start方法,直接返回成功状态即可
DBManager.start = jest.fn().mockResolvedValue();

方案2:全量mock mongodb模块(更贴合真实调用逻辑)

直接mock底层的mongodb依赖,不需要修改DBManager的私有属性,完全贴合真实业务调用流程:

// 测试文件顶部声明mock mongodb模块
jest.mock('mongodb', () => ({
  MongoClient: {
    connect: jest.fn().mockResolvedValue({
      db: jest.fn().mockReturnValue({ success: true })
    })
  }
}));

使用该方案时业务侧代码不需要做任何修改,正常调用await DBManager.start()后,DBManager.connection.db()即可返回你预设的mock值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:27:02