如何Mock MongoDB原生驱动中find()方法的toArray()?
如何Mock MongoDB的find().toArray()方法
没问题,我来帮你搞定这个Mock的问题!
因为MongoDB的find()方法返回的不是直接的Promise,而是一个游标(cursor)对象,toArray()是这个游标对象上的方法,它才会返回最终的Promise。所以不能像MockfindOne那样直接让find()返回Promise,得换个思路:先Mockfind()返回一个模拟的游标对象,再给这个对象加上我们Mock好的toArray()方法。
具体实现步骤
在你的content.test.js里,这样设置Mock:
// Mock Content.find 方法,返回一个带有toArray的模拟游标对象 Content.find = jest.fn(() => ({ // 让toArray返回一个resolved的Promise,包含你需要的模拟posts数据 toArray: jest.fn(() => Promise.resolve([ { _id: '1', title: 'First Post', category: 'foo' }, { _id: '2', title: 'Second Post', category: 'foo' } ])) }));
这样当你的代码执行const posts = await Content.find({ category: 'foo' }).toArray()时,posts就会是你模拟的数组数据了。
验证调用情况(可选)
如果你需要验证代码是否正确调用了find和toArray,可以在测试用例里添加这些断言:
// 验证find方法是否传入了正确的查询条件 expect(Content.find).toHaveBeenCalledWith({ category: 'foo' }); // 验证toArray方法是否被调用 expect(Content.find().toArray).toHaveBeenCalled();
多测试用例的Mock重置
如果有多个测试用例,为了避免Mock的状态污染,建议在beforeEach钩子中重置Mock:
beforeEach(() => { // 清空所有Mock的调用记录 jest.clearAllMocks(); // 重新设置find的Mock返回值 Content.find.mockReturnValue({ toArray: jest.fn(() => Promise.resolve([{ title: 'Mock Post', category: 'foo' }])) }); });
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

