问题描述
我正在使用 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;
但是情况是一样的,第一次测试通过,第二次尝试在同一个端口上提高快递。
解决方法
Supertest 能够为您启动和停止您的应用程序 - 您永远不需要在测试期间明确杀死 express 服务器(即使并行运行)
问题在于,在 app.js
中,您的服务器实际上已启动 - 这意味着当应用测试运行时,您的服务器会在每次读取 app.js
时启动(或每个测试用例一次)>
您可以通过将 server start
逻辑拆分成一个单独的文件来解决这个问题,这样导入 app.js
就不会启动应用程序(而是返回一个快速服务器实例)我通常用于此的模式是:
// app.js
import express from 'express'
export const app = express();
app.get("/example",(req,res) => {
return res.status(200).json({data: "running"})
})
// server.js
import app from "./app"
app.listen(3000,() => console.log("listening on 3000"));
// app.spec.js
import app from "./app"
import request from "supertest"
it("should be running",async () => {
const result = await request(app).get("/example");
expect(result.body).toEqual({data: "running"});
});