Mongoose 你如何开玩笑地模仿猫鼬函数?

Mongoose 你如何开玩笑地模仿猫鼬函数?,mongoose,jestjs,Mongoose,Jestjs,如何模拟mongoose调用,如find(),distinct(),count(),populate(),等等 我尝试了Mockingoose npm包,但它似乎仅限于基本调用,如find(),尽管它说可以与distinct()一起使用,但它要求您返回一个文档,并且不允许您返回数组。您可以使用jest.spyOn()然后使用mockImplementation()模拟第一个调用,如find()和update()。下面是一个findOneAndUpdate()的示例,我们正在检查以确保传递了正确的

如何模拟mongoose调用,如
find()
distinct()
count()
populate()
,等等


我尝试了Mockingoose npm包,但它似乎仅限于基本调用,如
find()
,尽管它说可以与
distinct()
一起使用,但它要求您返回一个文档,并且不允许您返回数组。

您可以使用
jest.spyOn()
然后使用
mockImplementation()
模拟第一个调用,如
find()
update()
。下面是一个
findOneAndUpdate()
的示例,我们正在检查以确保传递了正确的对象:

// TESTING:
// await Timeline.findOneAndUpdate(query, obj);
//

const Timeline = require("./models/user.timeline");
...
const TimelineFindOneAndUpdateMock = jest.spyOn(Timeline, "findOneAndUpdate");
const TimelineFindOneAndUpdate = jest.fn((query, obj) => {
    expect(obj.sendDateHasPassed).toBeFalsy();
    expect(moment(obj.sendDate).format()).toBe(moment("2018-11-05T23:00:00.000Z").format());
});
TimelineFindOneAndUpdateMock.mockImplementation(TimelineFindOneAndUpdate);
如果你想模拟一个链式函数,你可以让它返回一个对象和下一个你想调用的链式函数。下面是一个如何模拟链式
distinct()
调用的示例

// TESTING:
// let accountIDs = await Account.find(query).distinct("_id");
//
// WILL RETURN:
// ["124512341234","124512341234","124512341234"]
//

const Account = require("./models/user.account");
...
const AccountFindMock = jest.spyOn(Account, "find");
const AccountFindDistinctResult = ["124512341234","124512341234","124512341234"];
const AccountFindDistinctResult = jest.fn(() => AccountFindDistinctResult);
const AccountFindResult = {
    distinct: AccountFindDistinct
};
const AccountFind = jest.fn(() => AccountFindResult);
AccountFindMock.mockImplementation(AccountFind);
在测试运行之后,如果您想检查函数调用了多少次,比如调用了多少次
distinct()
,您可以添加以下内容:

expect(AccountFindDistinct).toHaveBeenCalledTimes(0);

您可以使用
jest.spyOn()
然后
mockImplementation()
模拟第一个调用,如
find()
update()
。下面是一个
findOneAndUpdate()
的示例,我们正在检查以确保传递了正确的对象:

// TESTING:
// await Timeline.findOneAndUpdate(query, obj);
//

const Timeline = require("./models/user.timeline");
...
const TimelineFindOneAndUpdateMock = jest.spyOn(Timeline, "findOneAndUpdate");
const TimelineFindOneAndUpdate = jest.fn((query, obj) => {
    expect(obj.sendDateHasPassed).toBeFalsy();
    expect(moment(obj.sendDate).format()).toBe(moment("2018-11-05T23:00:00.000Z").format());
});
TimelineFindOneAndUpdateMock.mockImplementation(TimelineFindOneAndUpdate);
如果你想模拟一个链式函数,你可以让它返回一个对象和下一个你想调用的链式函数。下面是一个如何模拟链式
distinct()
调用的示例

// TESTING:
// let accountIDs = await Account.find(query).distinct("_id");
//
// WILL RETURN:
// ["124512341234","124512341234","124512341234"]
//

const Account = require("./models/user.account");
...
const AccountFindMock = jest.spyOn(Account, "find");
const AccountFindDistinctResult = ["124512341234","124512341234","124512341234"];
const AccountFindDistinctResult = jest.fn(() => AccountFindDistinctResult);
const AccountFindResult = {
    distinct: AccountFindDistinct
};
const AccountFind = jest.fn(() => AccountFindResult);
AccountFindMock.mockImplementation(AccountFind);
在测试运行之后,如果您想检查函数调用了多少次,比如调用了多少次
distinct()
,您可以添加以下内容:

expect(AccountFindDistinct).toHaveBeenCalledTimes(0);