我正在尝试使用 Sinon.JS Stubs 测试(使用 Node.js MongoDB driver )以下调用...
collection.find({mood: 'happy'}).toArray((err, result) => {
// array result
cb(null, result);
});
让我困惑的是.toArray()
链式函数。上述调用返回 result
作为预期的 Array
。
为了展示我的斗争 - 并进行对比 - 我能够 stub 以下调用,该调用没有如此链接......
collection.findOne({id: 'id'}, (err, result) => {
// single result
cb(null, result);
});
stub =>
findOneStub.yields(null, {username: 'craig'});
有没有一种简单的方法来 stub 我的 .find
调用,该调用返回一个带有 .toArray
的函数以最终模拟我的结果?
最佳答案
当我想要像 Mongo 驱动程序那样对复杂嵌套对象的方法进行 stub 时,我通常做的是模拟一个模仿调用链的对象,如下所示:
使用回调 stub toArray()
let mockDbCollection = {
find: function() {
return {
toArray: function(cb) {
const results = [{
username: 'craig'
}];
cb(null, results);
}
};
}
};
sinon.stub(db, 'collection')
.returns(mockDbCollection);
db.collection('users').find({
id: 'id'
}).toArray((err, docs) => {
console.log(docs);
done();
});
使用 Promise stub toArray()
let mockDbCollection = {
find: function() {
return {
toArray: function() {
return Promise.resolve([{
username: 'craig'
}]);
}
};
}
};
sinon.stub(db, 'collection')
.returns(mockDbCollection);
db.collection('messages').find({
id: 'id'
}).toArray().then((docs) => {
console.log(docs);
done();
});
当您想要模拟对复杂对象的一系列调用时,可以使用此范例,仅关注链中最后一个调用的响应。您可以随心所欲地深入,没有任何问题。
如果你想要一些更高级的东西,比如设置 stub 的行为或计算调用次数等,你可以在这个 article 中找到一些其他技术。 。作者展示了一些使用复杂 DOM 对象的示例。
根据示例中的教程调整技术,我们可以轻松执行以下操作:
// here we stub the db.collection().findOne() method
// and fabricate a response
let stubFindOne = this.sandbox.stub().resolves({
_id: 'id'
});
// now, we can set the stub
// function in our mock object
let mockDb = {
collection: () => {
return {
findOne: stubFindOne
};
}
};
这样,我们就可以像平常一样操作和检查 stub 方法,例如
const args = stubFindOne.firstCall.args;
将返回第一次调用的参数列表等。
关于javascript - 如何 stub Node.js MongoDB 链式 fn 调用来模拟我的最终结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43727678/