Jest.js 超级测试和笑话:无法关闭快速连接

pieyvz9o  于 2023-04-10  发布在  Jest
关注(0)|答案(2)|浏览(148)

我使用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。

eufgjt7s

eufgjt7s1#

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"});
});
polhcujo

polhcujo2#

我的解决方案是在允许express监听连接之前确保NODE_ENV没有设置为'test'

if (process.env['NODE_ENV'] !== 'test') {
  app.listen(port, host, () => {
    console.log(`[ ready ] http://${host}:${port}`);
  });
}

相关问题