使用 Sinon 存根链式 Mongoose 调用
Using Sinon to stub chained Mongoose calls
我知道如何存根 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);
没有用,有什么建议吗?
我已经通过执行以下操作解决了它:
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);
看看sinon-mongoose。您只需几行就可以期待链式方法:
sinon.mock(YourModel).expects('findOne')
.chain('where').withArgs('someBooleanProperty')
.chain('exec')
.yields(someError, someResult);
您可以在 repo 上找到工作示例。
此外,建议:使用 mock
方法而不是 stub
,这将检查该方法是否确实存在。
如果你使用Promise,你可以试试sinon-as-promised:
sinon.stub(Mongoose.Model, 'findOne').returns({
exec: sinon.stub().rejects(new Error('pants'))
//exec: sinon.stub(). resolves(yourExepctedValue)
});
另一种方法是存根或监视创建的查询的原型函数(使用 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);
我将 promises 与 Mongoose 一起使用并存根这样的方法:
const stub = sinon.stub(YourModel, 'findById').returns({
populate: sinon.stub().resolves(document)
})
然后我可以这样称呼它:
const document = await YourModel.findById.populate('whatever');
我知道如何存根 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);
没有用,有什么建议吗?
我已经通过执行以下操作解决了它:
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);
看看sinon-mongoose。您只需几行就可以期待链式方法:
sinon.mock(YourModel).expects('findOne')
.chain('where').withArgs('someBooleanProperty')
.chain('exec')
.yields(someError, someResult);
您可以在 repo 上找到工作示例。
此外,建议:使用 mock
方法而不是 stub
,这将检查该方法是否确实存在。
如果你使用Promise,你可以试试sinon-as-promised:
sinon.stub(Mongoose.Model, 'findOne').returns({
exec: sinon.stub().rejects(new Error('pants'))
//exec: sinon.stub(). resolves(yourExepctedValue)
});
另一种方法是存根或监视创建的查询的原型函数(使用 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);
我将 promises 与 Mongoose 一起使用并存根这样的方法:
const stub = sinon.stub(YourModel, 'findById').returns({
populate: sinon.stub().resolves(document)
})
然后我可以这样称呼它:
const document = await YourModel.findById.populate('whatever');