【问题标题】:Trying to stub a method used inside a Node module尝试存根在 Node 模块中使用的方法
【发布时间】:2017-08-11 01:58:14
【问题描述】:

我正在尝试在 Node 模块中模拟一个函数。但它不允许我。有什么想法吗?

// module A

function foo(){
  return 1;
}

function bar(){
   return foo() + 1;
}

module.exports = {foo, bar}

在测试中……

const a = require('a');
...
sinon.stub(a, 'foo').callsFake(() => 3);
expect(a.bar()).to.equal(4); // gets 2 instead of 4

【问题讨论】:

    标签: node.js mocha.js sinon chai stub


    【解决方案1】:

    由于 Sinon 在模块中存根函数的方式,您实际上最终会遇到一个有趣的情况。您的函数实际上已被存根,但仅在 module.exports.foo 处被存根。你原来的函数foo 没有改变。基本上,Sinon 所做的就是用它们的特殊功能包装你的 module.exports.{function}

    如果您想让任何存根保留在您的 bar 函数中,您需要在导出对象上而不是直接引用 foo

    function bar() {
      return module.exports.foo() + 1;
    }
    

    祝你好运:)

    编辑:通常当我想做这样的事情时,我会编写我的模块并以这种方式使用它们的功能......

    // module A
    
    exports.foo = function foo() {
      return 1;
    }
    
    exports.bar = function bar() {
      return exports.foo() + 1;
    }
    

    这样,如果模块中的任何内容被存根/模拟/监视,它将应用于模块内的所有其他调用。但总的来说,我的建议是,如果你打算存根一个函数,你永远不想从任何地方直接引用它。你需要通过一个对象来引用这些函数,这样Sinon就可以对这个对象进行替换。

    【讨论】:

    • 别担心!我添加了一个替代方案,您可以在您的模块中尝试。当我需要在模块中存根函数时,我发现它总是对我有用。
    猜你喜欢
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2021-10-21
    • 2018-07-06
    • 2019-04-08
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多