2012-10-19 30 views
3

我想在node.js應用程序中用nodeunit存根功能。這裏是什麼,我試圖做一個簡化的版本:覆蓋node.js中其他模塊的功能

lib/file.js

var request = require('request'); 

var myFunc = function(input, callback){ 
    request(input, function(err, body){ 
     callback(body); 
    }); 
}; 

test/test.file.js

var file = require('../lib/file'); 

exports['test myFunc'] = function (test) { 
    request = function(options, callback){ 
     callback('testbody'); 
    }; 

    file.myFunc('something', function(err, body){ 
     test.equal(body, 'testbody'); 
     test.done(); 
    }); 
}; 

好像我不重寫request正確的,因爲當我嘗試運行測試,實際非存根request被調用,但我無法弄清楚正確的方法是什麼。

編輯:

要展開下面伊利亞的答案,上面我舉的例子。

lib/file/js

module.exports = function(requestParam){ 
    return { 
     myFunc: function(input, callback){ 
      requestParam(input, function(err, body){ 
       callback(body); 
      }); 
     } 
    } 
} 

然後在test/test.file.js

var fakeRequestFunc = function(input, callback){ 
// fake request function 
} 

var file = require('../lib/file')(fakeRequestFunc)(
//test stuff 
} 

回答

3

正如你注意到,在一個模塊中聲明的變量,不能輕易被其他模塊訪問。在這種情況下,有兩種常見的變異:

1)聲明你每一個模塊中需要的所有東西(不是你的情況,我想)

2)參數傳遞給函數

var ab = "foo", 
index = require('/routes/index')(ab); 

當你可以調用一個模塊的函數,你可以傳遞它的'請求'或任何你需要的其他變量或對象。

+0

嗨伊利亞,謝謝你的答案,但我真的不明白第二行的語法,或者如何使用它來從另一個模塊存根功能。什麼是「index = require('/ routes/index')(ab);」在做什麼?我如何在上面的示例中使用它? – Joe

+0

好的,我在@ tim-santeford的幫助下計算出來了。再次感謝伊利亞! – Joe

2

我遇到類似的問題。在探索request模塊代碼後,我的解決方案在我的代碼中使用了request.get而不是request(完全相同)。然後將其存儲在如下測試中:https://github.com/anatoliychakkaev/resizer-app/blob/master/test/resizer.js#L25

也可以在nodejs中存儲'require'方法的結果。檢查lib/module.js上的源文件來管理如何執行它。它應該是這樣的:

require('module')._cache['/path/to/request.js'] = your_stub 

但我不喜歡這樣的解決方案,因爲它沒有的情況下100%的工作,可能會停止在節點的未來版本的工作(這不是公共API),使只有在無法使用其他存根方式的情況下,才應該採用這種方式。