我认为答案是不要使用模仿鹅。仅凭玩笑就可以轻松完成。
您可以使用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);