2017-03-12 65 views
2

我仍然非常學習節點,JS,興農,proxyquire等谷歌地理編碼與proxyquire和興農

我有一個使用谷歌的地理編碼模塊(https://github.com/bigmountainideas/google-geocoder)的模塊,我很努力寫一個測試來存根。

這一切都歸結爲我認爲你如何設置它。在time.js我做如下按照谷歌地理編碼文件:

var geocoder = require('google-geocoder'); 

    ... 

module.exports = function(args, callback) { 
    var geo = geocoder({ key: some-thing }); 
    geo.find('new york', function(err, response) { ... }); 
} 

我試圖測試如下,但我得到的錯誤:

TypeError: geo.find is not a function 
    at run (cmdsUser/time.js:x:x) 
    at Context.<anonymous> (tests/cmdsUser/time-test.js:x:x) 

時間test.js:

var time; 
var findStub; 

before(function() { 
    findStub = sinon.stub() 
    time = proxyquire('./../../cmdsUser/time',{ 'google-geocoder': { find: findStub } }); 
}); 

describe('Demo test', function() { 
    it('Test 1', function(done){ 
    findStub.withArgs('gobbledegook').yields(null, { this-is: { an-example: 'invalid' } }); 

    time(['gobbledegook'], function(err, response) { 
     expect(response).to.equals('No result for gobbledegook'); 
     done(); 
    }); 
    }); 
}); 

我有點困惑。非常感謝。

回答

0

google-geocode的出口似乎被格式化爲:

{ 
    function() { 
     [...] 
     // Will return an instance of GeoCoder 
    } 
    GeoCoder: { 
     [...] 
     __proto__: { 
      find: function() { 
       // Replace me! 
      } 
     } 
    }, 
    GeoPlace: [...] 
} 

proxyquire似乎取代,即使在一個物體,爲您帶來更接近解決方案通過的關鍵"GeoCoder"包裝find時返回實例功能實際分配一個方法find到正確的對象。我做了一個測試項目,試圖學習克服這個問題的最佳方法,我覺得有點卡住了。但是既然你以前是callThru,那麼你不妨做一些proxyquire的骯髒工作,然後傳遞依賴的殘存版本。

before(function() { 
    // Stub, as you were before 
    findStub = sinon.stub() 
    // Require the module yourself to stub 
    stubbedDep = require('google-geocoder') 
    // Override the method with the extact code used in the source 
    stubbedDep.GeoCoder.prototype.find = findStub 
    // Pass the stubbed version into proxyquire 
    test = proxyquire('./test.js', { 'google-geocoder': stubbedDep }); 
}); 

我真的希望有更好的方法去做你想做的事。我相信階級的構建者以類似的方式行事,這讓我覺得其他人也有類似的問題(見下面的問題)。如果在半年後仍然是你的活躍項目,你應該加入那個對話或其他人的迴應,並在其他人那裏發佈回答,以迴應他人。

問題:#136#144#178