尝试存根Node模块中使用的方法

时间:2017-08-11 01:58:14

标签: node.js mocha sinon chai stub

我试图在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

1 个答案:

答案 0 :(得分:4)

由于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可以对对象执行替换。