Supertest and jest:无法关闭快速连接

问题描述

我正在使用 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"});
});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...