Как вы издеваетесь над функциями Mongoose в Jest?

Как вы издеваетесь над мангустами? find(), distinct(), count(), populate(), так далее.?

Я опробовал пакет Mockingoose npm, но, похоже, он ограничен только базовыми вызовами, такими как find() и хотя он говорит, работает с distinct() это требует, чтобы вы вернули документ и не позволили вам вернуть массив.

1 ответ

Решение

Ты можешь использовать 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);
Другие вопросы по тегам