如何使用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
相关产品推荐
相关产品推荐

