我正在尝试对我的应用程序运行单元测试,但单元测试超时。当我深入研究它时,我发现它在应用程序尝试设置会话数据的地方超时。如果我删除会话设置代码行,单元测试将继续(但失败,因为需要会话数据)。
// 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; ),那么测试将继续按预期运行。
这是一个最小的工作示例:
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
我遇到了完全相同的问题并最终确定原因是 jest.useFakeTimers() 我不知道为什么,但是删除它使测试按预期运行。