2014-04-10 75 views
4

我是新來的node.js和在我看到的大多數代碼中,我沒有看到IoC/DI樣式構造函數注入的依賴關係。如何模擬對象創建通過要求

相反,通常node.js擴展require()用於創建允許訪問外部模塊導出的本地變量。

但是,當編寫單元測試(即隔離單層/函數)時,如何模擬通過使用require創建的變量訪問的模塊?

/helpers/dataHelper.js 

var dataModel = require('../models/dataModel.js'); 

var getFormattedDataForRegion = function(region, callback) { 
    var data = {}; 
    // validate region 
    // query dataModel 
    // async.map format data items 
    // callback(data); 
} 

/tests/dataHelperTests.js 

describe('dataHelper', function(){ 

    it('getFormattedDataForRegion returns expected response', function(done){ 

     var expectedData = {}; 
     // populate expectedData 

     // **** need some way to mock dataModel ***** 

     dataHelper.getFormattedDataForRegion("west", function(data){ 
      expect(data).to.eql(expectedData); 
      done(); 
     }); 
    }); 

回答

1

這是用proxyquire完成的。

我個人不喜歡這種技術,但它是我發現尊重「節點方式」並仍然能夠輕鬆測試的最佳方式。你會這樣做:

var proxyquire = require('proxyquire'), 
    dataModelMock = require('./mocks/dataModel'); 

proxyquire('path/to/helpers/dataHelper.js', { '../models/dataModel.js': dataModelMock }); 
+0

好吧,我已經想通過'proxyquire'存根模塊函數,但只有一個通用的存根傳遞任何參數。我如何可以爲特定的參數值存根特定的返回值? (通常用moq,rhino) – BaltoStar

+0

顯然用'proxyquire'來超越瑣碎的存根,你必須創建一個完全模擬的模塊。我的模塊有一個屬性實例化爲具有原型函數的函數的實例,所以我需要將'myModule.myProperty.read(id)'存根。這可以用'proxyquire'完成,而不需要編寫'mockMyModule'? – BaltoStar

+0

@BaltoStar你似乎需要[sinon.js](http://sinonjs.org/)。查看他們的「功能一覽」部分(幾乎在主頁底部)。 – Esteban

相關問題