如何让 Nock 和 Mocha 协同工作?

2024-02-07

我正在尝试使用 nock 来拦截/模拟我的应用程序中的一些 HTTP 流量以进行测试。我们的应用程序对我们的另一个网站进行身份验证,我需要 nock 来模拟 HTTP 200(带有 JSON 数据)和 HTTP 401(没有数据)来测试用户登录或未登录时的行为(分别) 。

我有两个测试,单独运行时都可以正常工作,但如果我运行整个测试套件,其中一个总是会失败。我意识到 nock 是共享状态,因为它修改了 node.js 本身处理网络流量的方式,并且我认为这是竞争条件的原因,但我不能是唯一一个在同一请求中使用两个不同的 nock 拦截器的人两次不同的测试,所以我知道我错过了一些东西。

谁能帮我弄清楚为什么这些测试相互影响?

我的问题与如何使用 Mocha 和 Nock 重新测试相同的 URL? https://stackoverflow.com/questions/24553154/how-to-retest-same-url-using-mocha-and-nock但我做了那里建议的事情,但没有帮助。

我的测试文件(同样,如果单独调用,它们都可以正常工作,但在作为同一测试过程的一部分运行时会失败)如下所示:

import { expect } from 'chai';
import nock from 'nock';

import * as actionTypes from '../../src/constants/action-types';
import * as panoptes from '../../src/services/panoptes';

import { user } from '../modules/users/test-data';

const stagingHost = 'https://my-staging-server.org';

describe('Panoptes', () => {
  afterEach(function (done) {
    nock.cleanAll();
    nock.disableNetConnect();
    done();
  });

  beforeEach(function (done) {
    nock.cleanAll();
    nock.disableNetConnect();
    done();
  });

  describe('with a valid user', function (done) {
    let lastAction = null;

    const scope = nock(stagingHost)
      .get(/^\/oauth\/authorize/)
      .reply(302, '', {
        'location': 'https://localhost:3000',
        'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
        'X-Frame-Options': 'SAMEORIGIN',
        'X-XSS-Protection': '1; mode=block',
      });

    scope
      .get(/^\/api\/me/)
      .reply(200, {
        users: [user],
      });

    panoptes.checkLoginUser((action) => { lastAction = action; }).then(() => {
      nock.removeInterceptor(scope);
      done();
    });

    it('should know when somebody is logged in', function () {
      expect(lastAction).to.not.be.null;
      expect(lastAction.type).to.equal(actionTypes.SET_LOGIN_USER);
      expect(lastAction.user).to.not.be.null;
      expect(lastAction.user.id).to.equal(user.id);
      expect(lastAction.user.login).to.equal(user.login);
    });
  });
});

and

import { expect } from 'chai';
import nock from 'nock';

import * as actionTypes from '../../src/constants/action-types';
import * as panoptes from '../../src/services/panoptes';

const stagingHost = 'https://my-staging-server.org';

describe('Panoptes', () => {
  afterEach(function (done) {
    nock.cleanAll();
    nock.disableNetConnect();
    done();
  });

  beforeEach(function (done) {
    nock.cleanAll();
    nock.disableNetConnect();
    done();
  });

  describe('with no user', function (done) {
    let lastAction = null;

    const scope = nock(stagingHost)
      .get(/^\/oauth\/authorize/)
      .reply(302, '', {
        'Cache-Control': 'no-cache',
        'location': 'https://my-staging-server.org/users/sign_in',
        'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
        'X-Frame-Options': 'SAMEORIGIN',
        'X-XSS-Protection': '1; mode=block',
      });

    scope
      .get(/^\/api\/me/)
      .reply(401);

    panoptes.checkLoginUser((action) => { lastAction = action; }).then(() => {
      nock.removeInterceptor(scope);
      done();
    });

    it('should know that nobody is logged in', function () {
      expect(lastAction).to.not.be.null;
      expect(lastAction.type).to.equal(actionTypes.SET_LOGIN_USER);
      expect(lastAction.user).to.be.null;
    });
  });
});

我认为问题不在于 nock,而在于你的 mocha hook 的执行顺序:

举个例子:

describe('Panoptes', () => {

  afterEach(function () {
    console.log('ORDER: after each');
  });

  beforeEach(function () {
    console.log('ORDER: before each');
  });

  describe('with a valid user', function () {

    console.log('ORDER: with a valid user');

    it('should know when somebody is logged in', function () {
      console.log('ORDER: should know when somebody is logged in');
    });

  });

  describe('with no user', function () {

    console.log('ORDER: with no user');

    it('should know that nobody is logged in', function () {
      console.log('ORDER: should know that nobody is logged in');
    });

  });

});

当我们运行它时,我们得到以下输出顺序:

ORDER: with a valid user
ORDER: with no user
ORDER: before each
ORDER: should know when somebody is logged in
ORDER: after each
ORDER: before each
ORDER: should know that nobody is logged in
ORDER: after each

afterEach/beforeEach在每个之前和之后运行it, 但是,那describe在调用这些钩子之前对 body 进行评估。你应该把你的每个箭尾都包裹在一个before. (Also describe不使用done争论)

像这样的东西应该有效:

describe('with no user', function () {

  before(function() {
    const scope = nock(stagingHost)
      .get(/^\/oauth\/authorize/)
      .reply(302, '', {
        'Cache-Control': 'no-cache',
        'location': 'https://my-staging-server.org/users/sign_in',
        'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
        'X-Frame-Options': 'SAMEORIGIN',
        'X-XSS-Protection': '1; mode=block',
      });

    scope
      .get(/^\/api\/me/)
      .reply(401);
  });


  it('should know that nobody is logged in', function (done) {
    panoptes.checkLoginUser((action) => {
      expect(action).to.not.be.null;
      expect(action.type).to.equal(actionTypes.SET_LOGIN_USER);
      expect(action.user).to.be.null;
      done();
    });
  });

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

如何让 Nock 和 Mocha 协同工作? 的相关文章

随机推荐

  • 为什么IE要等到调用堆栈为空才发送POST AJAX请求?

    想象一下由几个不同的小部件组成的应用程序 当事件被触发时 小部件会清除当前数据 执行 AJAX 请求 然后在响应返回时放入新信息 以下是触发该事件时发生的情况的简化示例 for var i 0 i lt 10 i Do an AJAX po
  • 通过 stringmatch 与 dplyr 和 stringdist 合并两个数据帧

    我正在尝试基于非常相似的语言 这不准确 对两个数据帧进行 dplyr 左连接 DF1 title records Bob s show part 1 42 Time for dinner 77 Horsecrap 121 DF2 shown
  • 如何在 Sitecore RAD 编辑器中从我自己的项目特定 css 加载 css 类?

    如何在 Sitecore RAD 编辑器中从我自己的项目特定 css 加载 css 类 我想为客户提供选项 将预定义的 css 类添加到任何需要的元素 把CSS放进去default css在您网站的根文件夹中 然后重新启动 IIS Site
  • USB: usb_device_handle_win.cc:1020 无法从节点连接错误中读取描述符 ChromeDriver v87 / Chrome v87 在 Windows10 上使用 Selenium

    我们最近升级了我们的Windows 10使用 ChromeDriver v87 0 4280 20 和 Chrome v87 0 4280 66 官方版本 64 位 的测试环境 升级后 即使是最小的程序也会生成此错误日志 9848 1068
  • 强制 IE 重新计算样式?

    我构建了一个类似于的 javascript css 依赖管理器http code google com p jingo http code google com p jingo 它允许我做这样的事情 Loader DependsOn scr
  • iPhone4如何判断电源线是否插入?

    我想知道我的应用程序是否在连接外部电源线的情况下运行 是否可以在运行时找出这个状态 另一个问题 这是否能够区分真正的 USB 电源和那些外部 电池组 谢谢你 Use UIDevice财产batteryState UIDevice curre
  • 如何在运行时使用 Button Click 更改子 fxml gui 部分

    我正在尝试为一个大型复杂的 gui 构建一个框架 所以想法是用 javafx 2 1 中的 mvc 风格制作所有内容 因此每个组件都有一个 fxml 文件 如果需要的话还有 css 控制器和模型 我正在尝试找出如何更改子场景 运行时的子 f
  • 当某些列名可能不存在时使用 data.table::setnames()

    我有一个脚本返回一个data table其中将包含一组列 我想重命名其中一些列 但是setnames如果不是全部都存在则中断 有没有什么方法可以在不循环 错误捕获或与现有名称相交的情况下重命名 iris dt lt data table i
  • ??运算符未触发 DataTable DataRow 中的 System.DBNull 类型

    这是一个后续问题 Net C String Join 如果元素值为 null 如何输出 null 而不是空字符串 https stackoverflow com questions 16621347 net c sharp string j
  • 无法构造 - Jackson 的实例

    我正在使用 Jackson 并且遇到问题 当我尝试反序列化对象时出现以下错误 com fasterxml jackson databind JsonMappingException Can not construct instance of
  • 使用curl进行POST而不发送数据

    有没有办法使用curl发送POST请求而不发送任何数据 我们通常会发这样的帖子 curl data C mydata txt http 1 2 3 4 myapi 如果您省略 data你正在做一个 GET 操作 你怎么能省略它并仍然执行 P
  • C# 枚举范围

    获得范围 A Z 的方法是什么 Enumerable Range 1 100 Enumerable Range A Z 编辑 更新以包括达林的更正 在 NET 3 5 SP1 中 这可以工作 Enumerable Range A 26 Ca
  • Kibana Logstash ElasticSearch | Kibana Logstash ElasticSearch无法搜索未索引的字段

    我正在探索 ELK 堆栈并遇到一个问题 我已经生成了日志 将日志转发到logstash 日志采用JSON格式 因此它们被直接推送到ES中 仅在Logstash配置中使用JSON过滤器 连接并启动指向ES的Kibana 日志存储配置 filt
  • 使用 jsp/servlet 清理 URL?

    我计划使用 jsp 和 servlet 制作一个 CMS 谁能告诉我如何使用这种技术实现干净的网址 您可以尝试使用 urlrewritefilter http code google com p urlrewritefilter http
  • ora_rowscn 和 join 不能一起工作

    SELECT Rental Rental ora rowscn as TimeStamp FROM Rental inner join UserBranch on UserBranch fkBranchId Rental fkBranchI
  • JavaFX 对背景的影响

    我在用着this https stackoverflow com questions 22622034 frosted glass effect in javafx 22630754 22630754制作一个带有毛玻璃效果的iOS主题Jav
  • JavaScript 函数后的空格[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何按文件名和编号对文件列表进行排序?

    我在一个目录中有一堆文件 我试图根据它们的类型来获取它们 一旦我拥有它们 我想按文件名对它们进行排序 其中有一个数字 我想以这种方式对它们进行排序 我返回的文件是 file 1 txt file 2 txt file 10 txt file
  • C++ 未打印字符串

    抱歉这个菜鸟问题 我是一名新手程序员 正在从 C 过渡到 C 我可以轻松地编写一个程序 以相同的方式用 C 语言反转字符串 只需进行一些细微的更改 但是用 C 编写此程序 为什么它不打印任何内容 include
  • 如何让 Nock 和 Mocha 协同工作?

    我正在尝试使用 nock 来拦截 模拟我的应用程序中的一些 HTTP 流量以进行测试 我们的应用程序对我们的另一个网站进行身份验证 我需要 nock 来模拟 HTTP 200 带有 JSON 数据 和 HTTP 401 没有数据 来测试用户