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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 12:52:43