Node.JS 集成测试错误:listen EADDRINUSE: address already in use ::3000

问题描述

我使用 jestsupertest 进行集成测试。在 afterEach 部分我关闭了服务器:

let server;
describe('/api/user',() => {
   beforeEach(() => {
      server = require('../../../app');
   });

   afterEach(async () => {
      await server.close();
   });
//some tests
});

但是通过运行 npm test 我得到这个错误听 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 应用实例。

如果您想从您的 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);
   });

});

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...