我目前正面临一个我无法解决并在几个小时内挣扎的错误。 我使用以下版本: 节点:8.11.3 快递:4.16.3 开玩笑:22.2.2 猫鼬:5.2.3 我正在尝试用jest做一些集成测试,我有两个测试文件。 在每个文件中我写了以下内容:
// Create the server before each test
beforeEach(() => {
server = require('../../index');
});
// Close the server after each test
afterEach(async () => {
if (server) {
server.close();
}
});
在index.js
中我有以下内容(这不是所有代码,而是bug的相关代码):
// Listen to the server
const port = config.PORT || process.env.PORT || 3000;
module.exports = app.listen(port, () => {
winston.info(`Listening to port ${port}...`);
});
当我运行npm test
时,我总是得到这个例外:
**listen EADDRINUSE :::3000**
10 | // Listen to the server
11 | const port = config.PORT || process.env.PORT || 3000;
> 12 | module.exports = app.listen(port, () => {
13 | winston.info(`Listening to port ${port}...`);
14 | });
15 |
我尝试了几种方法来解决这个问题,将async await
添加到beforeEach
和afterEach
,并尝试将sever.close放入afterAll
和beforeAll
,但仍然遇到了同样的错误。
然后,我尝试通过这样做来解决:
How Do I Shut Down My Express Server Gracefully When Its Process Is Killed?
但同样,没有运气。
最后,当我在1个文件中编写所有测试时,它没有这个error
。有人知道如何解决这个问题吗?我不想在1个文件中编写所有集成测试..
谢谢!
尝试设置--runInBand标志,这将按顺序运行您的测试。
https://jestjs.io/docs/en/cli#runinband
在package.json脚本中:
"scripts": {
...
"test": "jest --watchAll --verbose --runInBand",
...
}
[更新]在进一步调查中,虽然您可以使用--runInBand顺序运行测试,但另一个选项是等待server.close(),因为它返回一个promise。因此,在你的afterEach中:
...
await server.close();
...
我遵循相同的课程并遇到同样的问题。 --runInBand
为我解决了这个问题。
我认为你的端口3000在其他地方很忙或者这个应用程序正在终端的其他地方运行,检查并关闭这个应用程序的所有实例。
要么
尝试使用以下代码:
// Listen to the server
11 | const port = config.PORT || process.env.PORT || 3001; // CHANGE POST 3000-> 3001
> 12 | module.exports = app.listen(port, () => {
13 | winston.info(`Listening to port ${port}...`);
14 | });
这里的问题是需要多次服务器文件。您不应该要求这样的服务器文件。每次这样做,一个实例启动,在你的第一个测试文件中已经启动了一个服务器实例,同时需要服务器为你的第二个文件,它尝试启动另一个实例,但是你的服务器已经在3000运行,因此错误。