如何在Jest中模拟含.lean()链式调用的全局数据库对象
解决Jest中模拟Mongoose带
.lean()的数据库调用问题 你的问题出在没有模拟lean()方法的链式调用。Mongoose的查询是链式结构,findOne()返回的查询对象需要先调用lean(),再调用exec(),所以你的mock对象必须完整覆盖这个调用链。
修改你的test.js中findOne的mock实现,让它返回包含lean()方法的对象,lean()再返回带有exec()的对象:
global.models = { Config: { TransactionCashmgmtConfigModel: { findOne: jest.fn() }, }, }; describe('getStoreData', () => { it('should return store data', () => { const mockData = {storeId: '1234', enabled: true}; global.models.Config.TransactionCashmgmtConfigModel.findOne.mockImplementation(() => { return { // 模拟lean方法,返回包含exec的对象 lean: () => { return { exec: (callback) => { callback(null, mockData); } } } }; }); getStoreData('1234', (err, data) => { // 注意:service.js里callback返回的是true,不是mockData,修正expect expect(data).toBe(true); // 可选:验证findOne是否被正确调用 expect(global.models.Config.TransactionCashmgmtConfigModel.findOne).toHaveBeenCalledWith({storeId: '1234'}); }); }); });
关键说明:
findOne返回的对象必须包含lean()方法,这个方法返回的对象再包含exec(),才能匹配原代码的.findOne().lean().exec()链式调用逻辑- 原
service.js中,查询成功时callback返回的是true而非mockData,所以你的断言需要对应修正,否则测试会失败
内容的提问来源于stack exchange,提问作者Kallol Medhi
相关产品推荐
相关产品推荐

