【问题标题】:How do I sinon.stub a nested method with a callback?如何 sinon.stub 带有回调的嵌套方法?
【发布时间】:2014-11-29 00:32:06
【问题描述】:

我需要测试一个包含调用 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
        }

      });

    });

  }
}

所以,我的测试看起来像这样(更新为在utility.js 之前加载requests.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(),而不是我的存根。

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

【问题讨论】:

    标签: node.js callback stub sinon


    【解决方案1】:

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

    编辑1:使用sinon.js

    这是我的意思的要点:https://gist.github.com/limianwang/1114249de99c6a189384

    编辑 2:使用proxyquire

    如果您打算简单地测试utilities,而不关心requests.makeAPICall 中实际发生的情况,您可以使用proxyquire 之类的东西来解决问题。如果您关心requests.js 中的实际逻辑,可以使用 sinon.stub 将实际的request.get api 存根。

    【讨论】:

    • 你的意思是在测试文件中?我需要在文件开头的requests.js 之前使用utilities.js(即在describe 语句之外)。我应该在描述语句中要求吗?
    • @Alfonso 交换要求的顺序。在您的测试中,在require('../lib/modules/utility.js') 之前加载require('../lib/modules/requests.js')。这将保证您在进行 API 调用之前将对象存根。
    • 谢谢!我晚饭后试试看。在要求utility.js 之前我应该​​存根吗?
    • 仍然忽略存根。
    • 我更新了问题以反映即使在 utility.js 之前加载 requests.js 时,存根也会被忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多