在节点中测试失败的请求

2024-03-08

我有一些代码如下所示:

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

Thanks!


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

您可以通过三种方式来控制响应request:

  1. 删除网络层(使用类似Nock https://www.npmjs.com/package/nock#how-does-it-work)这样你就可以控制 HTTP 层移交给的内容request图书馆。
  2. 使用依赖注入来注入一个可以用来代替的存根request.post(需要修改代码)
  3. Use a 连接缝将替换从返回的对象require()使用您控制的存根对象进行调用。这当然是你所做的。

就我个人而言,我会选择选项 2,因为它不需要额外的框架,易于推理且易于实现。您可以参考这个相当复杂的例子 https://stackoverflow.com/a/44482001/200987,但您的情况所需的代码很少。

不管怎样,既然你选择了选项 3,我不妨走这条路:-) 问题是你如何把post方法。那会调用你的回调吗?

我会改变post存根到这样的东西:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在节点中测试失败的请求 的相关文章

随机推荐

  • 如何在 CSS 中设置背景图像不透明度而不使用伪之前/之后和/或定位的 div

    我有一个由 CMS 生成的 div 其中包含一个背景图像 我想更改该背景图像的不透明度 而不影响该 div 子元素的不透明度 https jsfiddle net L5b81yqo https jsfiddle net L5b81yqo H
  • PyCharm 和 VirtualEnvs - 如何删除旧版本

    如何从 PyCharm 中删除遗留项目的所有痕迹 背景 我今天从 PyCharm 社区版升级到 PyCharm 专业版 原因是这样我就可以从事 Django 项目 特别是一个名为 deals 的新兴遗留项目 我删除了旧项目文件夹 然后 我打
  • Ember JS/Handlebars 视图助手

    目前 如果我们将视图定义为 view App myView ember handlebars 会将视图元素包裹在一个 div class ember view 有办法阻止这种情况吗 您可能想将 tagName 设置为 App MyView
  • “无法从安装目录获取安装脚本的一致路径”

    我正在使用 pip 从 git 存储库安装包 pip install e git git github com knipknap SpiffWorkflow git master egg SpiffWorkflow dev 克隆存储库没有问
  • 如何编写一个 C++ 程序来过滤掉非整数?

    像这样的东西 cout lt lt Enter the number of columns cin gt gt input while input int cout lt lt endl lt lt Column size must be
  • 偏移日期时间解析

    需要从格式解析日期时间2016 06 24T13 39 44 687680 第一步使用 尝试用线路解析没有微秒的时间 System out println OffsetDateTime parse 2011 12 03T10 15 30 D
  • 使用 C++ 实现 Android 事件处理程序

    我有一个 Java 布局设计 目前正在通过 JNI 移植到 C 我实际上已经完成了这一点 但我目前对如何设置事件处理程序 例如 setOnClickListener 感到困惑 我已经经历过JNI规范 https docs oracle co
  • 快速解码 JPEG 图像的方法

    我需要解码 解压为位图 非常小的 大约 1200 1200 JPEG 问题是我需要尽快完成 我尝试过 libjpeg 但速度很慢 我也尝试过 BitmapFactory decodeByteArray 它有点快 但仍然不够快 还有什么其他选
  • 在哪里编辑 mysql 全文停用词列表?

    我看到mysql的全文停用词列表是英文的 考虑到 mysql 在全世界范围内使用 这有点奇怪 无论如何 我将 ft min word len 降低到 3 所以我需要将我的语言中的常用单词添加到此列表中 有人可以告诉我在哪里可以找到它吗 Th
  • Rails 3 日期时间比较与 ActiveRecord 查询中的日期

    我试图在模型中搜索等于特定日期的任何日期 同时忽略时间戳 在 Rails 中我可以简单地执行它DateTime to date somedate 但是我认为在 SQL 中制定起来并不那么容易 因为我无法将 to date 方法应用于整个列
  • S3 Lambda 在 10 分钟后触发双重调用

    我们遇到了由 S3 ObjectCreated Events 触发的 Lambda 的双重 Lambda 调用 那些双重调用发生exactly第一次调用后 10 分钟 不是第一次尝试完成后 10 分钟 而是第一次调用发生后 10 分钟 原始
  • 以随机顺序迭代数组[重复]

    这个问题在这里已经有答案了 给定一个序列N元素 比如std vector or T 是否有任何有效的方法可以按随机顺序迭代其元素 仅访问每个元素一次 该解决方案必须避免创建带有打乱索引的附加数组 EDIT 我们还需要能够跟踪原始索引 不是特
  • 将决策边界拟合到 R 中的逻辑回归模型

    我正在努力使用 ggplot 在 R 中绘制决策边界 我有两个变量 考试成绩 和一个学生是否被录取的二元分类 数据如下所示 gt head exam data Exam1Score Exam2Score Admitted 1 34 6236
  • addLoadEvent 无助于解决 onload 冲突

    我使用流行的 addLoadEvent 进行所有 JS 加载 如下所示 function addLoadEvent func var oldonload window onload if typeof window onload funct
  • 如何在 R kableextra 中将 kable 标题/标题居中,同时保持行左对齐

    我想让表格的标题 标题 居中 但列的值保留分配 我还希望我的标题被分成两行 并且每行都居中 align选项以相同的方式更改它们 head mtcars gt kbl caption first row second row align l
  • ggplot2 3.1.0 中的自定义 y 轴刻度和辅助 y 轴标签

    Edit 2 ggplot2 package 的当前开发版本确实解决了我在下面的问题中提到的错误 使用安装开发版本 devtools install github tidyverse ggplot2 Edit 这似乎是错误的行为sec ax
  • Rails、RVM、Apache、Passenger 错误 - SpawnManager 权限在 2.3.11 中被拒绝

    我使用 Passenger 时遇到以下错误 这似乎只有在使用 2 3 11 时才会出现问题 我怎样才能解决这个问题 Passenger ERROR ext common ApplicationPool SpawnManager h 220
  • 使用android和php进行套接字编程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试创建一个使用套接字连接到
  • Yii:按 id ASC 选择最后 20 个条目

    我想获取表中最后 20 个条目 但按 ID 升序排序 在 Sql 中 这并不是很复杂 SELECT FROM SELECT FROM comments WHERE postID id ORDER BY id DESC LIMIT 20 t
  • 在节点中测试失败的请求

    我有一些代码如下所示 var request require request function Service this config require path to config json Service prototype doThin