我正在使用jest和supertest来引发express的实例并在其上运行测试。
我遇到了端口繁忙的问题,但仍然无法解决。
在我的测试中,我做了下一步:
import supertest from 'supertest';
const agent = supertest(app);然后我用agent请求,一切都很好。直到我运行另一个测试。在app.js中,我有:
var app = express();
app.post('/auth/changePassword',VerifyToken, auth.changePassword);
app.listen(4001, function () {
console.log('Server is running');
});所以第一个规范运行的很好。但是second会尝试侦听已经在使用的端口。我真的不知道如何关闭这里的连接。
我尝试过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。
发布于 2021-03-06 16:28:57
Supertest能够为您启动和停止您的应用程序-您永远不需要在测试期间显式地终止express服务器(即使是在并行运行时)。
问题是,在app.js中,您的服务器实际上是启动的-这意味着当应用程序测试运行时,每次读取app.js (或每个测试用例一次)时,您的服务器都会启动。
您可以通过将server start逻辑拆分到一个单独的文件中来解决这个问题,这样导入app.js就不会启动应用程序(而是返回一个express服务器实例)我通常使用的模式是:
// 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"});
});https://stackoverflow.com/questions/66503707
复制相似问题