Node.JS integration test error: listen EADDRINUSE: address already in use :::3000
Node.JS integration test error: listen EADDRINUSE: address already in use :::3000
我已经使用 jest and supertest 进行集成测试。在 afterEach 部分我关闭了服务器:
let server;
describe('/api/user', () => {
beforeEach(() => {
server = require('../../../app');
});
afterEach(async () => {
await server.close();
});
//some tests
});
但是 运行 npm test
我得到这个错误:
listen EADDRINUSE: 地址已被使用::3200
当我只使用一个 something.test.js 文件时,一切正常。问题是当我添加一个新的 something.test.js 时。怎么了?
这里是 package.json:
{
"name": "users",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "jest --watchAll"
},
"author": "Saeed Heidarbozorg",
"license": "ISC",
"dependencies": {
"config": "^3.3.4",
"express": "^4.17.1",
"express-async-errors": "^3.1.1",
"joi": "^17.4.0",
"morgan": "^1.10.0",
"pg": "^8.5.1",
"winston": "^3.3.3"
},
"devDependencies": {
"jest": "^26.6.3",
"supertest": "^6.1.3"
}
}
tl;dr 在测试环境中,您根本不想创建 http 服务器,只需测试您的 express 应用程序实例即可。
如果您想 post 从您的 app.js
获取您的代码,我可能会给您一个更快的修复。
总的来说,这是我构建它的方式,以便于完成 tl;dr:
app.js
包含所有 express-y 内容:
import express from 'express';
const app = express();
// ... do all your express-y stuff
export default app;
index.js
是启动服务器的应用程序的入口点。测试期间不需要此文件:
import http from 'http';
import app from './app';
http.createServer(app).listen(...);
测试时,您根本不需要 index.js
,只需从 app.js
导入您的 Express 应用并进行测试:
一些测试文件:
import app from './app';
import request from 'supertest';
describe('...',() => {
test('...', async () => {
expect((await request(app).get('/some/route')).status).toBe(200);
});
});
我已经使用 jest and supertest 进行集成测试。在 afterEach 部分我关闭了服务器:
let server;
describe('/api/user', () => {
beforeEach(() => {
server = require('../../../app');
});
afterEach(async () => {
await server.close();
});
//some tests
});
但是 运行 npm test
我得到这个错误:
listen EADDRINUSE: 地址已被使用::3200
当我只使用一个 something.test.js 文件时,一切正常。问题是当我添加一个新的 something.test.js 时。怎么了?
这里是 package.json:
{
"name": "users",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "jest --watchAll"
},
"author": "Saeed Heidarbozorg",
"license": "ISC",
"dependencies": {
"config": "^3.3.4",
"express": "^4.17.1",
"express-async-errors": "^3.1.1",
"joi": "^17.4.0",
"morgan": "^1.10.0",
"pg": "^8.5.1",
"winston": "^3.3.3"
},
"devDependencies": {
"jest": "^26.6.3",
"supertest": "^6.1.3"
}
}
tl;dr 在测试环境中,您根本不想创建 http 服务器,只需测试您的 express 应用程序实例即可。
如果您想 post 从您的 app.js
获取您的代码,我可能会给您一个更快的修复。
总的来说,这是我构建它的方式,以便于完成 tl;dr:
app.js
包含所有 express-y 内容:
import express from 'express';
const app = express();
// ... do all your express-y stuff
export default app;
index.js
是启动服务器的应用程序的入口点。测试期间不需要此文件:
import http from 'http';
import app from './app';
http.createServer(app).listen(...);
测试时,您根本不需要 index.js
,只需从 app.js
导入您的 Express 应用并进行测试:
一些测试文件:
import app from './app';
import request from 'supertest';
describe('...',() => {
test('...', async () => {
expect((await request(app).get('/some/route')).status).toBe(200);
});
});