2016-02-18 50 views
1

我有這個功能在我的代碼:如何使用sinon.stub將單元測試寫入「請求」節點模塊?

let request = require("request"); 
let getDrillDownData = function (userId, query, callback) { 

query.id = userId; 
let urlQuery = buildUrlFromQuery(query); 

request.get({ 
    url: urlQuery, 
    json: true 
}, function (error, response, data) { 
    if (!error && response.statusCode === 200) { 
     return callback(null, calculateExtraData(data)); 
    } else if (error) { 
     return callback(error, null); 
    } 
}); 

};

,我希望寫一些單元測試,驗證,當函數被調用,它運行OK, 當有它做了一個錯誤返回錯誤

我寫這個單元測試代碼正確的參數:

describe.only('Server Service Unit Test', function(){ 
var sinon = require('sinon'), 
    rewire = require('rewire'); 

var reportService; 
var reportData = require('./reportData.json'); 

beforeEach(function(){ 
    reportService = rewire('../../services/reports.server.service'); 
}); 

describe('report methods', function(){ 
    var reportData; 
    var query = { id: "test"}; 
    var userId = 'testuser'; 
    var getDrillDownData; 

    var request; 

    beforeEach(function(){ 
     getDrillDownData = reportService.__get__('getDrillDownData'); 
    }); 

    it ('should get drill down data by userId and query', function(done){ 
     var getCallback = sinon.stub(); 

     request = { 
      get: sinon.stub().withArgs({ 
       url: query, 
       json: true 
      }, getCallback.withArgs("error", {statusCode: 200}, reportData)) 
     }; 

     reportService.__set__('request', request); 

     getDrillDownData(userId, query, function(err, returnData){ 
      (err === null).should.eql(true); 
      //(getCallback.withArgs(undefined, {statusCode: 200}, reportData).calledOnce).equal(true); 
      done(); 
     }); 
}); 

});

,但我不斷收到錯誤:

錯誤:2000毫秒的超時超標。確保在此測試中正在調用done()回調。

有人可以幫忙嗎? 感謝

回答

3

我會直接存根request.get()

describe('report methods', function() { 

    // Make `request.get()` a Sinon stub. 
    beforeEach(function() { 
    sinon.stub(request, 'get'); 
    }); 

    // Restore the original function. 
    afterEach(function() { 
    request.get.restore(); 
    }); 

    it ('should get drill down data by userId and query', function(done) { 
    // See text. 
    request.get.yields(null, { statusCode : 200 }, { foo : 'bar' }); 

    // Call your function. 
    getDrillDownData('userId', {}, function(err, data) { 
     ...your test cases here... 
     done(); 
    }); 
    }); 
}); 

使用request.get.yields()(它調用第一個函數參數是興農可以在參數列表中找到;在這種情況下,它是被傳遞到request.get()(error, response, data)回調在你的函數中),你可以告訴Sinon使用哪個參數來調用回調函數。

這樣,你可以檢查回調到request.get()是否正確處理所有參數。

您也可以使用.withArgs()request.get.withArgs(...).yields(...)),雖然您必須確定您正確使用它;否則,如果確切的參數不匹配,Sinon將調用原始的request.get()而不是使用stubbed版本。

取而代之,我更喜歡在之後使用stub.calledWith()來檢查正確參數。這與Mocha更好地集成在一起,因爲您可以使用明確的斷言。

+0

謝謝!它幫助了我! – eran10