当我为我的项目编写单元测试时,我遇到的情况是,我需要在mongoose模块中模拟一个链接多个调用的函数。
如果它只调用.populate()一次,类似于下面的代码:
await mongoose.model("routeDetail").find({
_id: {
$in: requestBody.routeIds,
},
})
.populate("organizationId")
我可以很容易地模仿它,比如mocks/mongoose.js。
module.exports = {
model: jest.fn().mockReturnThis(),
find: jest.fn().mockReturnThis(),
populate: jest.fn().mockReturnThis(),
sort: jest.fn().mockReturnThis(),
};
test/myFile.test.js
mongoose.populate = jest.fn().mockReturnValueOnce(myValue);
但是..。在另一种情况下,.populate()被多次调用,如下面的代码,我不知道如何模拟它。
await mongoose.model("routeDetail").find({
_id: {
$in: requestBody.routeIds,
},
})
.populate("organizationId")
.populate("deliverDetail.orderInfo")
有人有主意吗?请帮我解决这个案子,很多人!
发布于 2021-12-28 15:47:18
对于这个特定的例子,您可以模拟实现:
const model = {
find: jest.fn(() => ({
populate: jest.fn(() => ({
populate: jest.fn(() => Promise.resolve([])),
})),
})),
};
模型是一个具有find
函数的对象,该函数返回一个带有populate
函数的对象,该函数返回一个带有populate
函数的对象,该函数返回解析空数组的Promise
。
发布于 2021-12-29 02:36:15
在文件.test.js中,在需要模拟的情况下编写下面的代码
mongoose.populate = jest.fn().mockReturnValue({
populate: jest.fn().mockResolvedValueOnce({name:"mock value"})
});
就这样。对我来说很管用
但是在其他情况下,当一个函数包含2个查询猫鼬时,第一个查询是
find().populate().populate()
(调用populate()两次)
下一个是
find().populate()
(只调用populate()一次)
再说一遍,我不知道该嘲笑什么。
https://stackoverflow.com/questions/70504594
复制相似问题