当前位置: 首页 > 面试题库 >

Sinon存根被跳过作为节点表达中间件

余铭晨
2023-03-14
问题内容

我正在尝试测试特定路线的行为。即使我创建存根,它也会继续运行中间件。我希望事件认证暂时通过。我了解到,这并不是真正的“单元”测试。我快到那里了。我还简化了代码。这是要测试的代码:

const { rejectUnauthenticated } = require('../modules/event-authentication.middleware');

router.get('/event', rejectUnauthenticated, (req, res) => {
  res.sendStatus(200);
});

这是我要跳过的中间件:

const rejectUnauthenticated = async (req, res, next) => {
  const { secretKey } = req.query;
  if (secretKey) {
    next();
  } else {
    res.status(403).send('Forbidden. Must include Secret Key for Event.');
  }
};

module.exports = {
  rejectUnauthenticated,
};

测试文件:

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');
let app;
const authenticationMiddleware = require('../server/modules/event-authentication.middleware');

const { expect } = chai;
chai.use(chaiHttp);

describe('with correct secret key', () => {
  it('should return bracket', (done) => {
    sinon.stub(authenticationMiddleware, 'rejectUnauthenticated')
      .callsFake(async (req, res, next) => next());

    app = require('../server/server.js');

    chai.request(app)
      .get('/code-championship/registrant/event')
      .end((err, response) => {
        expect(response).to.have.status(200);
        authenticationMiddleware.rejectUnauthenticated.restore();
        done();
      });
  });
});

我尝试过其他类似的问题,但是我仍然从中间件中获取403,应该跳过它。我还以调试模式运行测试,因此我知道应该存根的中间件功能仍在运行。

这是存根我的代码的问题吗?这是ES6问题吗?

我可以重组我的代码或测试以使其正常工作吗?


问题答案:

存根代码确实存在问题。

当您需要服务器文件时

const app = require('../server/server.js');

您的应用是通过包括在内的整套中间件创建的,并且在中间rejectUnauthenticated存储了对中间件的引用app

当你做

sinon.stub(authenticationMiddleware, 'rejectUnauthenticated')
  .callsFake(async (req, res, next) => next());

您将替换模块的rejectUnauthenticated导出方法authenticationMiddleware,而不是替换rejectUnauthenticated已存储的原始引用。

解决方案是 模拟外部中间件方法 创建应用程序(即require('../server/server.js');): __

const chai = require('chai');
const chaiHttp = require('chai-http');
const sinon = require('sinon');

// don't create app right away
let app;
const authenticationMiddleware = require('../server/modules/event-authentication.middleware');

const { expect } = chai;
chai.use(chaiHttp);

describe('with correct secret key', () => {
  it('should return bracket', (done) => {
    sinon.stub(authenticationMiddleware, 'rejectUnauthenticated')
      .callsFake(async (req, res, next) => next());

    // method is stubbed, you can create app now
    app = require('../server/server.js');

    chai.request(app)
      .get('/code-championship/registrant/event')
      .end((err, response) => {
        expect(response).to.have.status(200);
        authenticationMiddleware.rejectUnauthenticated.restore();
        done();
      });
  });
});


 类似资料:
  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对

  • 我试图为express中间件功能设置存根伪造,但它并没有被取代。 我正试图通过callsFake函数使用sinon stubbing,正如他们最新文档中建议的那样。 即使我需要模块并在导出时替换属性中的函数。我一直看到原来的函数行为在起作用。 我知道我应该在安装中间件函数之前尝试将函数存根,而这正是第一次导入express的时候。 这是我尝试存根的函数,定义为函数并导出为对象。它在脚本文件中定义,

  • 我正在尝试使用typescript、mocha、sinon和chai http为我的express路由器编写一个集成测试。这个路由器使用我编写的自定义中间件,它检查头中的JWT。 理想情况下,我想存根我的authMiddleware,这样我就可以控制它的行为,而不必为每个测试用例提供有效/无效的JWT。 当我尝试在测试中存根时,我意识到Express使用的实际实现,而不是模拟的实现。 在模拟aut

  • 我试图理解西农图书馆的假、间谍、存根和模拟之间的区别,但无法清楚地理解。 有人能帮我了解一下吗?

  • 我正在用sinon和ava做测试。我正在清除一些函数,并检查这些函数是否被调用。我检查了控制台,函数正在被调用。但是sinon返回的是notCalled(。称为假)。下面是这段代码。 }; });

  • 问题内容: 解析时是否可以跳过节点,这与它有什么关系? 考虑以下XML: 我想跳过“钠”元素 问题答案: 您可以执行以下操作: MyContentHandler 此类负责处理您的XML文档。击中要忽略的节点时,可以在IgnoringContentHandler中进行交换,这将吞噬该节点的所有事件。 忽略ContentHandler 当IgnoringContentHandler完成吞咽事件后,它将