【问题标题】:Testing failed requests in node在节点中测试失败的请求
【发布时间】:2017-11-15 17:40:58
【问题描述】:

我有一些代码如下所示:

var request = require('request');

function Service(){
 this._config = require('../path/to/config.json');
}

Service.prototype.doThing = function(){
  return new Promise(function(resolve, reject){
    request.post(url, {payload}, function(error, response, body){
      //handle response
      resolve(true);
    }).on('error', function(err){
      //handle errors
      resolve(false);
    });
  });
}

我正在尝试测试错误运行的块,但由于承诺而遇到困难。我使用 mocha 进行测试运行,使用 sinon 进行存根。我可以存根请求,以便我可以计算调用 on 方法的次数,但包含的 Promise 永远不会解决。

有一些包可以与 sinon 一起处理 Promise(我尝试过 sinon-as-promised 和 sinon-stub-promise),但我必须对整个 doThing 方法进行存根处理才能正确解析。对于测试此代码或可能更容易测试的替代代码结构的正确方法,我将不胜感激。

有问题的测试(挂起等待 doThing 承诺返回)如下:

context('when the server is unavailable', function(){
  beforeEach(function() {
    var onStub = sinon.stub();
    requestStub = {post: function(){ return {on: onStub}}};
    Service = proxyquire('path/to/service', {request: requestStub});
    service = new Service();
  });

  it('should not set the auth key', function(){
    return service.doThing().then(function(x){
      return assert(onStub.calledOnce);
    });
  });
});

谢谢!

【问题讨论】:

  • 只是对模块代码的评论。与其在resolve 函数中传回状态值,不如在出现问题时执行reject 方法。在大多数情况下更有意义:-)
  • 我的回答对您有帮助吗?没有回复、点赞或指定答案...
  • 它帮助我拓宽了我的整体知识,但实际上是一位同事解决了我遇到的问题。在我自己写答案之前,我正在给他一个回应的机会。
  • 他修复了你的post 回调,我猜?但是您知道,如果您发现几个答案有用,您可以投票赞成 - 即使您将答案授予其他人;-)

标签: javascript node.js promise sinon


【解决方案1】:

总而言之,您的问题是您无法控制request 对象,或者更确切地说是来自其post 方法的响应。如果您可以控制,您将能够在 doThing 方法中测试所有不同的代码路径。

您有三种可能控制来自request 的响应:

  1. 存根网络层(使用Nock 之类的东西),这样您就可以控制HTTP 层将什么交给request 库。
  2. 使用依赖注入注入一个存根,可以用来代替request.post(需要修改代码)
  3. 使用 link seam 将使用您控制的存根对象替换从require() 调用返回的对象。这当然是你所做的。

就个人而言,我会选择选项 2,因为它不需要额外的框架,易于推理且易于实现。您可以参考this quite elaborate example,但您的案例所需的代码很少。

无论如何,既然您选择了选项 3,我不妨沿着这条路线走 :-) 问题在于您如何取消 post 方法。那会不会打电话给你的回调?

我会将post 存根更改为如下内容:

post: (url, options, cb) => { 
  cb(null, null, null); // will resolve your promise in the module
  return { on: onStub }; 
}

当然,如果您稍后需要对这些值执行某些操作,则传递给您的回调的 nulls 可以是其他内容。

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 2016-07-05
    • 2015-11-06
    • 2019-02-09
    • 2020-07-04
    • 2015-10-27
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多