javascript - 如何 stub Node.js MongoDB 链式 fn 调用来模拟我的最终结果?

标签 javascript node.js unit-testing sinon stub

我正在尝试使用 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/

相关文章:

javascript - express 是否提供来自隐藏(点)文件夹的静态文件

objective-c - 单元测试以验证对象是否被释放

c# - 你应该如何使用 NUnit 3.2?

javascript - 单击时的 HTML/CSS 按钮更改为输入字段和提交按钮

node.js - 使用 Mongoose 将嵌入文档保存为对象?

javascript - promise 履行中的未定义错误

javascript - 如何使用 firebase auth 在 nodejs 的服务器端验证用户电话号码

c++ - cppunit 断言失败时如何显示十六进制值

javascript - liferay 6.2 中 javascript 和 css 文件中的图像调用

javascript - HTML 复选框到 Javascript 表单