簡體   English   中英

如何在Node.js中模擬外部依賴方法回調參數?

[英]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更改為導出函數中的參數。 然后在其他地方(應用程序,主程序或任何其他程序),您可以執行以下操作:

app.js

var module1Creator = require('module1');
var module2 = require('module2');
var module1 = module1Creator(module2);

然后,當您需要測試時...

testModule1.js

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()時間。

為此,我使用Sinon.js在測試文件中創建了模擬

上面的過程實際上解決了我的問題,無需更改整個設計,而且我能夠進行測試。 這就是為什么我將其發布為答案。 但是,在這里我不會將其設置為正確的答案,因為如前所述,我不完全了解此機制,因此更改必需的模塊不是一個好習慣。

我想看看其他開發人員對此有何評論,如果討論可以接受,我最終將其設置為正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM