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

如何使用Jest模拟MongoDB链式调用函数 解决collection不是函数报错

报错原因

你编写的Mock代码存在两层结构错误,才会触发DbConnection.db(...).collection is not a function报错:

  1. DbConnection.db()执行后返回的是Jest模拟函数本身,而非包含collection方法的实例对象,自然无法调用collection方法
  2. 业务代码用await调用insertMany,而原来的Mock中insertMany返回普通对象,即使修完第一层结构也会触发异步报错
修复后的模拟代码
const DbConnection = {
  // db方法本身设为mock函数,支持后续调用断言
  db: jest.fn().mockReturnValue({
    // collection方法设为mock函数,可校验传入的集合名是否正确
    collection: jest.fn().mockReturnValue({
      // insertMany返回Promise适配await调用,同时设为mock函数支持参数校验
      insertMany: jest.fn().mockResolvedValue({ success: true })
    })
  }),
  close: jest.fn().mockResolvedValue(true)
};
可选调整

如果你需要单次调用生效的模拟,将对应方法的mockReturnValue/mockResolvedValue替换为mockImplementationOnce/mockResolvedValueOnce即可。

配套断言示例

你可以通过Jest的断言方法验证调用逻辑是否符合预期:

// 验证db方法被调用
expect(DbConnection.db).toHaveBeenCalled();
// 验证collection方法传入了正确的集合名
expect(DbConnection.db().collection).toHaveBeenCalledWith(this.collectionName);
// 验证insertMany传入了预期的日志数据
expect(DbConnection.db().collection().insertMany).toHaveBeenCalledWith(logs);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:51:01