2016-01-05 29 views
0

好的,我正在认真地尝试第一次学习单元测试,我正在使用摩卡& Sinon。模块中的单元测试功能

所以假设的哑模块包含函数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

这似乎从兴农文档逻辑...

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它仍然使用原来的'未打开的'。

看起来好像创建一个存根就是为该 函数创建一个新的局部变量,而不是将其存储在模块中。

或者我错过了某些东西 - 或者只是做错了什么?

回答

0

好的,一些研究表明,像这样的桩是只替换module.exports属性的值而不是底层函数。所以我需要使用像rewire这样的东西来实际进入模块。

所以,现在如果我把兴农存根,只是做:

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

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

它的工作原理...种。它只有在我从myModule中删除自动执行函数时才起作用,即删除(function(){ ... })();。我的理解是,这是一种最佳做法...但也许只能在浏览器中使用?我猜想的是完全不同的问题。