当我运行单元测试时,我收到以下警告。
工作进程未能正常退出,已被强制退出。这可能是由于不正确的拆卸导致测试泄漏所致。请尝试使用--detectOpenHandles运行以查找泄漏。活动计时器也可能导致此问题,请确保对它们调用了.unref()。
当我使用--detectOpenHandles
时,它给我以下错误。
为了解决这个问题,现在我在package.json脚本上使用以下命令。
"test:ci": "jest --runInBand --forceExit"
然而,我对这个解决方案并不满意,而且我仍然收到了使用--detectOpenHandles的警告。
看来,我写异步测试的方式是错误的?或者如何才能正确地修复它?
请注意,我已正确关闭了数据库连接。
afterAll(async () => {
if (mongo) {
await mongo.stop();
}
mongoose.connection.close();
});
公寓测试的代码。
import request from 'supertest';
import { app } from '../../app';
it('fails when a email that does not exist is supplied', async () => {
await request(app)
.post('/api/users/signin')
.send({
email: 'test@test.com',
password: 'password',
})
.expect(400);
});
it('fails when an incorrect password is supplied', async () => {
await request(app)
.post('/api/users/signup')
.send({
email: 'test@test.com',
password: 'password',
})
.expect(201);
await request(app)
.post('/api/users/signin')
.send({
email: 'test@test.com',
password: 'aslkdfjalskdfj',
})
.expect(400);
});
it('responds with a cookie when given valid credentials', async () => {
await request(app)
.post('/api/users/signup')
.send({
email: 'test@test.com',
password: 'password',
})
.expect(201);
const response = await request(app)
.post('/api/users/signin')
.send({
email: 'test@test.com',
password: 'password',
})
.expect(200);
expect(response.get('Set-Cookie')).toBeDefined();
});
先谢谢你了。
2条答案
按热度按时间67up9zun1#
您的Express应用程序在启动时可能会执行一些在测试套件中未被嘲笑的操作。
也许它会对另一个服务进行真实的的获取调用,以获得关于生态系统的信息,或者连接到一个redis示例,或者某种日志聚合器。
您可能需要查看所有应用程序代码,以确定它所依赖的外部功能,然后确保您的测试套件创建了足够的填充程序,以便应用程序可以在测试期间可靠地关闭。
有时候,像这样的应用服务器有一个显式的关闭函数,当它从编排器接收到一个kill信号时,它的主机容器会调用这个函数。如果你的应用有一个函数,那么这个函数可能就像你会发现的外部依赖列表一样。
apeeds0o2#
我也遇到了同样的问题,只是我的app.js文件中缺少了一个反斜杠。
因此,jest无法连接到路由,这对于发送该请求的jest worker来说是一个死胡同。
尝试检查app.js文件中的路径