模块中的单元测试功能

时间:2016-01-05 14:31:08

标签: javascript node.js unit-testing

好的,我第一次正在学习单元测试,我正在使用Mocha& amp;兴农。

假设的哑模块,包含函数foobarFoo取决于bar

(function() {

  var bar = function(callback) {
    if (willOfTheGods) {
      callback('err', null);
    } else
      callback(null, 'hurrah');
  }

  var foo = function() {

    bar(function(err, res) {
      //blah deh blah
    });
  }

  module.exports = {
    bar: bar,
    foo: foo
  }

})();

我想要存根bar,以便我可以测试foo

这在Sinon文档中似乎合乎逻辑......

var myModule = require('../myModule');
sinon.stub(myModule, 'bar')
myModule.bar.callsArgWith(0, ['err', null]);

但只有在测试中调用bar时才有效。

myModule.bar(function(err, result){
  console.log('err, result');
});

当我致电myModule.foo时,它仍然使用原始的'未被取消的'。

似乎创建一个存根只是为它创建一个新的局部变量 功能而不是在模块中对其进行存根。

或者我完全错过了什么 - 或者只是做错了什么?

1 个答案:

答案 0 :(得分:0)

好吧,有些研究表明,像这样的存根只是替换了module.exports属性的值而不是底层函数。所以我需要使用类似More on this at MDN的东西来实际进入模块。

现在,如果我放弃Sinon存根,只需执行:

var myModule = rewire('../myModule');

myModule.__set__('bar', function(callback){
  callback('err', null);
});

它有效......有点儿。它只有在我从myModule中删除自执行函数包装时才有效,即删除(function(){ ... })();。我的理解是这是一种最佳实践......但也许只能在浏览器中使用?我猜是完全不同的问题。

相关问题