如何使用Jest模拟MongoDB链式调用函数 解决collection不是函数报错
报错原因
你编写的Mock代码存在两层结构错误,才会触发DbConnection.db(...).collection is not a function报错:
DbConnection.db()执行后返回的是Jest模拟函数本身,而非包含collection方法的实例对象,自然无法调用collection方法- 业务代码用
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
相关产品推荐
相关产品推荐

