使用Sinon来存根链接的Mongoose调用

时间:2015-01-08 18:47:34

标签: node.js mongoose sinon

我得到了如何存根Mongoose模型(感谢Stubbing a Mongoose model with Sinon),但我不太明白如何存根调用如下:

myModel.findOne({"id": someId})
    .where("someBooleanProperty").equals(true)
    ...
    .exec(someCallback);

我尝试了以下内容:

var findOneStub = sinon.stub(mongoose.Model, "findOne");
sinon.stub(findOneStub, "exec").yields(someFakeParameter);

无济于事,有什么建议吗?

5 个答案:

答案 0 :(得分:16)

我通过以下方式解决了这个问题:

var mockFindOne = {
    where: function () {
        return this;
    },
    equals: function () {
        return this;
    },
    exec: function (callback) {
        callback(null, "some fake expected return value");
    }
};

sinon.stub(mongoose.Model, "findOne").returns(mockFindOne);

答案 1 :(得分:7)

看看sinon-mongoose。您可以只用几行来预测链式方法:

sinon.mock(YourModel).expects('findOne')
  .chain('where').withArgs('someBooleanProperty')
  .chain('exec')
  .yields(someError, someResult);

您可以在回购中找到工作示例。

另外,建议:使用mock方法代替stub,这将检查方法是否真的存在。

答案 2 :(得分:2)

另一种方法是存根或间谍创建的Query的原型函数(使用sinon):

const mongoose = require('mongoose');

sinon.spy(mongoose.Query.prototype, 'where');
sinon.spy(mongoose.Query.prototype, 'equals');
const query_result = [];
sinon.stub(mongoose.Query.prototype, 'exec').yieldsAsync(null, query_result);

答案 3 :(得分:1)

如果您使用Promise,可以尝试sinon-as-promised

sinon.stub(Mongoose.Model, 'findOne').returns({
  exec: sinon.stub().rejects(new Error('pants'))
  //exec: sinon.stub(). resolves(yourExepctedValue)
});

答案 4 :(得分:0)

我在Mongoose上使用promises并存根这样的方法:

const stub = sinon.stub(YourModel, 'findById').returns({
    populate: sinon.stub().resolves(document)
})

然后我可以这样称呼它:

const document = await YourModel.findById.populate('whatever');