带有proxyquire和sinon的google-geocoder

时间:2017-03-12 15:40:57

标签: node.js unit-testing sinon proxyquire

我还在学习节点,js,sinon,proxyquire等。

我有一个使用google-geocode模块(https://github.com/bigmountainideas/google-geocoder)的模块,我正在努力编写一个测试来存根。

这一切都归结为我认为你如何设置它。在time.js中,我根据google-geocoder文档执行以下操作:

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();
    });
  });
});

我有点困惑。非常感谢。

1 个答案:

答案 0 :(得分:0)

google-geocode的导出似乎格式为:

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

proxyquire似乎替换了返回实例的函数,即使将find包装在具有键"GeoCoder"的对象中,也可以通过实际分配方法{{}来使您更接近解决方案1}}到正确的对象。我做了一个测试项目,试图学习克服这个问题的最佳方法,我觉得有点卡住了。但是既然你以前是find,那么你也可以做代理查询的脏工作,然后传递依赖的存根版本。

callThru

我真的希望有更好的方式去做你喜欢的事情。我相信上课&#39;构造函数以类似的方式行事,这使我认为其他人也有类似的问题(请参阅下面的问题)。您可能应该加入该回复或其他回复,并在此处为其他人发回答案,如果这仍然是您半年后的活跃项目而没有回复。

问题:#136#144#178