我一直试图解决这个问题,但没有运气。在使用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告诉我一个打开的手柄可能会阻止它退出:
在这种情况下,它确实退出了,但仍然注意到一个打开的句柄。我想知道如何安全地关闭它,而不是强迫退出。通过以前的测试,我会得到相同的打开句柄警告,但也有一个错误,说明在完成测试后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
如果有人可以分享关于为什么会发生这种情况的任何想法,那将非常感激。
我在用:
快递:4.16.3
它是:23.5.0
NPM:6.3.0
试试这个:
beforeAll(async () => {
// let's create a server to receive integration calls
app = express();
app.get('/', (req, res) => res.send('Hello World!'));
await new Promise((resolve) => {
app.listen(6666, () => {
console.log('Example app listening on port 6666!');
return resolve();
});
});
});
afterAll(() => { console.log('closing...'); app.close(); });