Sinon存根包含同步和异步功能的对象

问题描述 投票:2回答:1

我正在开发一个项目,我正在观察node.js javascript层调用的每个绑定层函数的类型。对于观察类型,我使用sinon创建了一个看起来像这样的存根

var originalProcessBinding = process.binding;
sinon.stub(process, 'binding').callsFake(function (data) {
  var res = originalProcessBinding(data);
  // custom code here
  return res;
}

所以,我的想法是看看object内的每个res,看看它是否是Function。如果是,则创建一个记录状态的存根,然后调用原始的Functioncustom code看起来像

_.forEach(res, function(value, key) {
  if (_.isFunction(value)) {
    sinon.stub(res, key).callsFake(function() {
      var args = arguments;
      // do some processing with the arguments
      save(args);
      // call the original function
      return value(...arguments);
    }
  }
}

但是,我不确定这是否处理所有类型的退货。例如,如何处理错误?如果函数是异步的,会发生什么?

我运行了node.js测试套件,发现了很多失败的测试用例。有没有更好的方法来存根功能。谢谢。

编辑:失败的测试用例有共同的错误,看起来像Callback was already calledTimeoutExpected Error

javascript node.js decorator sinon stub
1个回答
0
投票

不幸的是,尽管可以修复许多错误,但很难将sinon添加到构建过程中。我在vanilla js中通过自己的stubbing方法实现了解决这个问题。任何想要存储内部node.js函数的人都会觉得这很有帮助。

(function() { process.binding = function(args) {
    const org = process.binding;
    const util = require('util');

    var that = org(args),
      thatc = that;
      for (let i in thatc) {
        if (util.isFunction(thatc[i]) && (!thatc[i].__isStubbed)) {
          let fn = thatc[i];
          if (i[0] !== i[0].toUpperCase()) {
            // hacky workaround to avoid stubbing function constructors.
            thatc[i] = function() {
              save(arguments);
              return fn.apply(that, arguments);
            }
            thatc[i].__isStubbed = true; 
          }
        }
      }
    return thatc;
  } 
})();

此代码使用Node.js的当前主服务器传递所有测试。添加sinon似乎改变了触发内部v8检查失败的函数对象。

© www.soinside.com 2019 - 2024. All rights reserved.