控制器设置会话数据时超级测试单元测试超时

问题描述 投票:0回答:2

我正在尝试对我的应用程序运行单元测试,但单元测试超时。当我深入研究它时,我发现它在应用程序尝试设置会话数据的地方超时。如果我删除会话设置代码行,单元测试将继续(但失败,因为需要会话数据)。

// unit test code;
describe('Check if endpoint are reachable', () => {

  before(function(done) {
    // call /router to generate session;
    AGENT.get('/router')
        .query(clientData)
        .expect(302)
        .end((err, res) => {
            if (!err) {
                done()
            } else {
                done(err);
            }
        });
  });

  //  .......

});


// controller code where the session is set;

// .....

req.session.clientData = clientData;

// ....

当我运行代码时,出现以下错误: 错误:超时超过 2000 毫秒。对于异步测试和挂钩,确保调用“done()”;如果返回 Promise,请确保它已解析。 (C:\Nedbank a-serverui application ests uthorise.js)

但是,如果我注释掉会话设置行 ( // req.session.clientData = clientData; ),那么测试将继续按预期运行。

node.js express mocha.js supertest
2个回答
0
投票

这是一个最小的工作示例:

app.js

const express = require("express");
const session = require("express-session");
const app = express();

app.use(
  session({
    secret: "keyboard cat",
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true },
  }),
);

function controller(req, res) {
  const clientData = req.query;
  console.log(clientData);
  req.session.clientData = clientData;
  res.sendStatus(302);
}

app.get("/router", controller);

app.get("/api", (req, res) => {
  res.sendStatus(200);
});

module.exports = app;

app.test.js

const supertest = require("supertest");
const app = require("./app");
const agent = supertest(app);
const { expect } = require("chai");

describe("Check if endpoint are reachable", () => {
  const clientData = { name: "supertest" };
  before((done) => {
    agent
      .get("/router")
      .query(clientData)
      .expect(302)
      .end((err, res) => {
        if (!err) {
          done();
        } else {
          done(err);
        }
      });
  });

  it("should pass", async () => {
    const res = await agent.get("/api");
    expect(res.status).to.be.eq(200);
  });
});

集成测试结果与覆盖率报告:

  Check if endpoint are reachable
{ name: 'supertest' }
    ✓ should pass


  1 passing (44ms)

-------------|----------|----------|----------|----------|-------------------|
File         |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
-------------|----------|----------|----------|----------|-------------------|
All files    |    96.15 |       50 |      100 |    96.15 |                   |
 app.js      |      100 |      100 |      100 |      100 |                   |
 app.test.js |    92.86 |       50 |      100 |    92.86 |                17 |
-------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/56526009


0
投票

我遇到了完全相同的问题并最终确定原因是 jest.useFakeTimers() 我不知道为什么,但是删除它使测试按预期运行。

© www.soinside.com 2019 - 2024. All rights reserved.