我如何sinon.stub一个带回调的嵌套方法?

时间:2014-11-29 00:32:06

标签: node.js callback stub sinon

我需要测试一个方法,该方法包含一个调用API服务器的子方法。我想研究这个内部子方法,但我似乎无法做到这一点。这是一个例子:

var requests = require('./requests.js');

var utilityClass = {
  methodCreatesObject: function (callback) {

    // Here’s the method I’m trying to stub:
    requests.makeCallToAPI(requestObject, function (err, responseFromAPI) {

      doSomethingWithResponse(responseFromAPI, function (err, finalObject) {

        if (err) {
          callback(err, null);
        } else {
          callback(null, finalObject); // <- Want to test the value of finalObject
        }

      });

    });

  }
}

所以,我的测试看起来像这样(更新后显示在requests.js之前加载utility.js):

var should   = require('should'),
    Joi      = require('joi'),
    sinon    = require('sinon'),
    requests = require('../lib/modules/requests.js'),
    utility  = require('../lib/modules/utility.js')
    ;

// Start my tests:
describe('Method', function () {

  before(function () {
    var fakeAPIresponse = { ... }
    sinon.stub(requests, 'makeCallToAPI').yield(null, fakeAPIresponse);
  });

  it('should produce a well-formed finalObject', function (done) {
    utilityClass.methodCreatesObject(function (err, response) {
      if (err) {
        done(err);
      } else {
        response.should.do.this.or.that;
        done();
      }
    });
  });

});

据我了解,.yields()应该尝试运行它在参数中检测到的第一个回调,并将自己的参数提供给它(产生doSomethingWithResponse(responseFromAPI, function () {...}))。但是,在运行mocha时,我收到一条错误,表明无法访问API服务器,这表示正在调用真实的requests.makeCallToAPI(),而不是我的存根。

我一定错过了什么。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您要求request.js在哪里?在加载要测试的模块之前,您需要要求request.js.

编辑1:使用sinon.js

以下是我的意思:https://gist.github.com/limianwang/1114249de99c6a189384

编辑2:使用proxyquire

如果您打算简单地测试utilities而不关心requests.makeAPICall中实际发生的事情,您可以使用类似proxyquire的方法来执行此操作。如果您关注requests.js中的实际逻辑,可以使用sinon.stub来删除实际的request.get api。