2016-01-05 130 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(){ ... })();。我的理解是,這是一種最佳做法...但也許只能在瀏覽器中使用?我猜想的是完全不同的問題。