我正在尝试使用 Jest 和 Supertest 测试在 Node + Express 中制作的非常基本的 API,但我收到以下输出警告:
Jest has detected the following 1 open handle potentially keeping Jest from exiting:
● TCPSERVERWRAP
> 34 | const server = app.listen(PORT, () => {
| ^
35 | console.log(`Server is running on port ${PORT}.`);
36 | });
37 |
我的服务器在服务器入口JS文件中是这样定义的:
const server = app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}.`);
});
module.exports = server;
我的测试文件如下所示:
describe('Users endpoint', () => {
let server;
beforeEach(() => { server = require('../server'); });
afterEach((done) => { server.close(done); });
it('should create new user if we do a POST', (done) => {
request(server)
.get('/api/users')
.expect(200)
.end(done);
});
});
据我所知,调用
server.close()
并在 afterEach 函数上传递 done 参数应该确保服务器在每次单元测试后关闭,但事实并非如此。
我错过了什么吗?
已经找到解决方案
除了我唯一的测试用例之外添加一个新的测试用例并修改 afterEach 函数后,删除 done 参数,如下所示:
afterEach(() => { server.close(); });
打开手柄警告不再显示。
我的服务器的定义和你一样。但在我所有的测试都通过之后,我想杀死JEST。
如果有人也想这样做
在你的 file.test.js 顶部添加
const server = require('../app');
最后
afterAll((done) => server.close(done));
if (process.env.NODE_ENV !== 'test') {
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Server started on port ${port}.`);
});
};