Express Supertest和jest:无法关闭快速连接

Express Supertest和jest:无法关闭快速连接,express,jestjs,supertest,Express,Jestjs,Supertest,我使用jest和supertest来生成express实例并对其运行测试 我面临着仍然无法解决的繁忙端口问题 在我的测试中,我做下一步: import supertest from 'supertest'; const agent = supertest(app); 然后我去了探员那里,一切正常。 直到我运行另一个测试。 在app.js中,我有: var app = express(); app.post('/auth/changePassword',VerifyToken, auth.ch

我使用jest和supertest来生成express实例并对其运行测试

我面临着仍然无法解决的繁忙端口问题

在我的测试中,我做下一步:

import supertest from 'supertest';
const agent = supertest(app);
然后我去了探员那里,一切正常。 直到我运行另一个测试。 在app.js中,我有:

var app = express();

app.post('/auth/changePassword',VerifyToken, auth.changePassword);

app.listen(4001, function () {
    console.log('Server is running');
});
所以第一个规范运行得很完美。但第二个尝试侦听已在使用的端口。 我真的不知道如何关闭这里的连接

我尝试了
app.close()
,但在使用这种方法时出现了错误。这很清楚,我必须分配

server = app.listen(4001, function () {
    console.log('Server is running');
});
server.close();
但我不知道我该怎么做。 我还尝试在jest.setup中预设代理,并将其分配给全局变量

import app from "../../server/app";
import supertest from 'supertest';

const agent = supertest(app);
global.agent = agent;

但情况是一样的,第一个测试通过,第二个尝试在同一个端口上启动express。

Supertest可以为您启动和停止应用程序-您不需要在测试期间明确关闭express服务器(即使并行运行)

问题在于,在
app.js
中,您的服务器实际上已启动-这意味着当运行应用程序测试时,每次读取
app.js
时(或每个测试用例一次),您的服务器都会启动

您可以通过将
服务器启动
逻辑拆分为一个单独的文件来解决此问题,这样导入
app.js
不会启动应用程序(而是返回一个express server实例)。我通常使用的模式是:

//app.js
从“express”导入express
export const app=express();
app.get(“/example)”,(请求、回复)=>{
返回res.status(200).json({data:“running”})
})
//server.js
从“/app”导入应用程序
app.listen(3000,()=>console.log(“监听3000”);
//app.spec.js
从“/app”导入应用程序
从“supertest”导入请求
它(“应该正在运行”,异步()=>{
const result=等待请求(app.get(“/example”);
expect(result.body).toEqual({data:“running”});
});