gpt4 book ai didi

javascript - Jest 使用 Express 应用程序检测打开句柄

转载 作者:数据小太阳 更新时间:2023-10-29 04:51:54 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决这个问题,但没有成功。我最初在使用 MongoDB 数据库执行简单的集成测试时遇到了问题,但我已经剥离了代码并使其尽可能简单。我唯一运行的是一个测试文件:

// blah.test.js
const express = require('express');
const app = express();

describe('test block', () => {
let server = null;

beforeEach(() => {
server = app.listen(3000, () => console.log('Listening on port 3000'));
});

afterEach(async () => {
await server.close();
});

it('should pass the test', () => {
expect(1).toBe(1);
});
});

测试通过,但 Jest 通知我打开的句柄可能会阻止它退出:

enter image description here

这一次,它确实退出了,但仍然注意到一个打开的句柄。我想知道如何安全地关闭它,而不是强制退出。在之前的测试中,我会收到相同的打开句柄警告,但还会出现错误,指出 Jest 在完成测试后一秒钟内没有退出。

我还尝试使用 beforeAll()afterAll(),而不是 beforeEach()afterEach(),但仍然遇到同样的问题。我知道这次测试不需要服务器,但我试图让它尽可能简单,试图找到打开和关闭服务器的问题。

更新:我注意到在我添加第二个测试文件后它似乎工作正常:

// blah2.test.js
const express = require('express');
const app = express();

describe('test block', () => {
let server = null;

beforeEach(() => {
server = app.listen(3000, () => console.log('Listening on port 3000'));
});

afterEach(async () => {
await server.close();
});

it('should pass the test', () => {
expect(2).toBe(2);
});
});

No open handles with two tests running

如果有人可以分享关于为什么会发生这种情况的任何想法,我们将不胜感激。

我正在使用:

express :4.16.3

开 Jest :23.5.0

NPM:6.3.0

最佳答案

所以我通过将所有应用程序逻辑抽象到一个 app.js 文件来解决这个问题:

const express = require('express');
const routes = require('./routes');
const app = express();

app.use('/api', routes);

module.exports = app

然后用我所有的服务器逻辑创建一个 server.js 文件:

const app = require('./app.js')
const PORT = process.env.PORT || 3000
app.listen(PORT, () => console.log(`Listening on port: ${PORT}`))

然后像这样将 app.js 导入到你的测试文件中:

const app = require('../app.js')

像魅力一样工作!

关于javascript - Jest 使用 Express 应用程序检测打开句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com