你如何将distinge与mockingoose一起使用?

时间:2018-10-05 17:17:49

标签: node.js mongoose jestjs mockingoose

使用Jest运行测试时,我正在使用Mockingoose来模拟我的猫鼬调用。我试过了,但出现错误

mockingoose.Account.toReturn(
    ["593cebebebe11c1b06efff0372","593cebebebe11c1b06efff0373"],
    "distinct"
);

错误:

ObjectParameterError: Parameter "obj" to Document() must be an object, got 593cebebebe11c1b06efff0372

因此,我然后尝试将其传递给文档对象数组,但它仅返回文档。我如何得到它仅返回数组或字符串?

这是我正在测试的函数中的代码:

const accountIDs = await Account.find({
    userID: "test",
    lastLoginAttemptSuccessful: true
}).distinct("_id");

如果有人知道更好的方法,我愿意接受其他模拟猫鼬呼叫的方法。谢谢!

2 个答案:

答案 0 :(得分:1)

您不能。

我的坏。我研究了模拟的实现,并意识到,通过实现一个模拟,它“支持”了 distinct ,但实际上,它只返回给定的文档,就像其他操作一样。

为此问题打开了pull request并添加了测试,因此您的示例应该有效并且可以正常工作。

答案 1 :(得分: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);