[英]How to mock an external dependency method callback params in Nodejs?
假設我有以下幾點:
lib /模塊/module1.js
var m2 = require('module2');
module.exports = function(){
return {
// ...
get: function(cb){
m2.someMethod(params, function(error, data){
if(error){
cb(error)
}
cb(null, data)
})
},
// ...
}
}
現在讓我們說我在另一個目錄中有一組測試,例如tests / testModule1.js 。 從該文件中,我創建一個module1
實例來執行一些測試。
我想從文件testModule1.js模擬m2.someMethod
傳遞給其回調函數(而不是cb
函數)的對象 。
我已經研究了Sinon.js ,但是我找不到解決方法。 其實,我什至有可能?
謝謝。
您可以使用諸如proxyquire
類的proxyquire
,但是我不喜歡修改內置的require
。
就個人而言,我建議重寫您的代碼以使用依賴項注入:
module.exports = function(m2){
return {
// ...
get: function(cb){
m2.someMethod(params, function(error, data){
if(error){
cb(error)
}
cb(null, data)
})
},
// ...
}
}
請注意,我將m2
更改為導出函數中的參數。 然后在其他地方(應用程序,主程序或任何其他程序),您可以執行以下操作:
var module1Creator = require('module1');
var module2 = require('module2');
var module1 = module1Creator(module2);
然后,當您需要測試時...
var module1Creator = require('module1');
// inject the "fake" version containing test data, spies, etc
var module2Mocked = require('module2mock');
var module1 = module1Creator(module2mocked);
我通常會同意更改設計,正如@dvlsg所建議的那樣,DI也是我的選擇。
但是,我正在從事的項目已經在進行中,並且規模很大。 進行此更改將意味着巨大的人力成本,在這種情況下,尤其是這樣做不值得。
作為一種解決方案,我意識到,一旦執行了require('someModule')
,就會將someModule裝入並以單例形式存儲在某種全局緩存中(我不完全了解這種機制,但是我我會仔細研究一下),無論您是否require('someModule')
其他文件的require('someModule')
,都將收到緩存的版本。
因此,如果我在lib / modules / module1.js中執行require('module2')
, 則將 module2加載並存儲在此緩存中,並且我可以require('module2')
並在tests / testModule1.js中對其進行模擬。 這將反映從lib / modules / module1.js中調用get()
時間。
上面的過程實際上解決了我的問題,無需更改整個設計,而且我能夠進行測試。 這就是為什么我將其發布為答案。 但是,在這里我不會將其設置為正確的答案,因為如前所述,我不完全了解此機制,因此更改必需的模塊不是一個好習慣。
我想看看其他開發人員對此有何評論,如果討論可以接受,我最終將其設置為正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.