我目前遇到一个无法解决并且无法正常工作的错误。
我正在使用以下版本:
节点:8.11.3
快递:4.16.3
开玩笑:22.2.2
猫鼬:5.2.3
我正在尝试用玩笑做一些集成测试,并且我有2个文件进行测试。
在每个文件中,我写了以下内容:
// Create the server before each test
beforeEach(() => {
server = require('../../index');
});
// Close the server after each test
afterEach(async () => {
if (server) {
server.close();
}
});
在index.js
中,我有以下内容(这不是全部代码,而是与错误相关的代码):
// 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
和{{1 }},但仍然出现相同的错误。
然后,我尝试通过以下方法解决:
How Do I Shut Down My Express Server Gracefully When Its Process Is Killed?
但是,再次没有运气。
最终,当我将所有测试写在1个文件中时,没有此beforeAll
,它就可以工作。有人知道如何解决这个问题吗?我不想将所有集成测试写在一个文件中。.
谢谢!
答案 0 :(得分:5)
尝试设置--runInBand标志,它将按顺序运行测试。
https://jestjs.io/docs/en/cli#runinband
在package.json脚本中:
"scripts": {
...
"test": "jest --watchAll --verbose --runInBand",
...
}
[更新]在进一步调查中,虽然可以使用--runInBand顺序运行测试,但是另一个选择是等待server.close(),因为它返回了Promise。因此,在您的afterEach中:
...
await server.close();
...
答案 1 :(得分:1)
我遵循相同的课程,并且遇到相同的问题。 --runInBand
为我解决了这个问题。
答案 2 :(得分:0)
我认为您的端口3000在其他地方繁忙,或者此应用程序正在终端中的其他位置运行,请检查并关闭此应用程序的所有实例。
或
尝试使用以下代码:
perl -E 'say join ", ", @ARGV' abc def ghi
答案 3 :(得分:0)
这里的问题是需要多次服务器文件。您不应该需要这样的服务器文件。每次执行此操作时,一个实例都会启动,在第一个测试文件中,一个服务器实例已启动,而在第二个文件中需要服务器时,它将尝试启动另一个实例,但随后您的服务器已经在3000上运行,因此会出现错误