未捕获的错误:在 mocha 单元测试时监听 EADDRINUSE:地址已在使用 :::3000

Posted

技术标签:

【中文标题】未捕获的错误:在 mocha 单元测试时监听 EADDRINUSE:地址已在使用 :::3000【英文标题】:Uncaught Error: listen EADDRINUSE: address already in use :::3000 when mocha unit testing 【发布时间】:2019-10-11 23:56:11 【问题描述】:

我在单元测试代码时遇到此错误,

2 通过 (14ms) 1 失败

1) 测试套件外未捕获的错误: 未捕获的错误:监听 EADDRINUSE:地址已在使用 :::3000 在 Server.setupListenHandle [as _listen2] (net.js:1255:14) 在listenInCluster (net.js:1303:12) 在 Server.listen (net.js:1391:7) 在 Function.listen (node_modules/express/lib/application.js:618:24) 在 Object.listen (main.js:39:5) 在 Module._compile (internal/modules/cjs/loader.js:721:30) 在 Module._compile (node_modules/pirates/lib/index.js:99:24) 在 Module._extensions..js (internal/modules/cjs/loader.js:732:10) 在 Object.newLoader [as .js] (node_modules/pirates/lib/index.js:104:7) 在 Module.load (internal/modules/cjs/loader.js:620:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:560:12) 在 Function.Module._load (internal/modules/cjs/loader.js:552:3) 在 Module.require (internal/modules/cjs/loader.js:657:17) 在需要(内部/模块/cjs/helpers.js:22:18) 在对象。 (测试/main.test.js:4:1) 在 Module._compile (internal/modules/cjs/loader.js:721:30) 在 Module._compile (node_modules/pirates/lib/index.js:99:24) 在 Module._extensions..js (internal/modules/cjs/loader.js:732:10) 在 Object.newLoader [as .js] (node_modules/pirates/lib/index.js:104:7) 在 Module.load (internal/modules/cjs/loader.js:620:32) 在 tryModuleLoad (internal/modules/cjs/loader.js:560:12) 在 Function.Module._load (internal/modules/cjs/loader.js:552:3) 在 Module.require (internal/modules/cjs/loader.js:657:17) 在需要(内部/模块/cjs/helpers.js:22:18) 在 Array.forEach () 在 StatWatcher.onchange (internal/fs/watchers.js:50:8)

我正在使用 mocha,并且我的 package.json 中有 --watch。我正在使用es6的方法来表达。

Package.json


  "name": "elies6express",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": 
    "test": "./node_modules/.bin/mocha --watch --require @babel/register",
    "start": "nodemon --exec babel-node main.js"
  ,
  "author": "",
  "license": "ISC",
  "dependencies": 
    "body-parser": "^1.19.0",
    "bookshelf": "^0.14.2",
    "chai-http": "^4.3.0",
    "cookie-parser": "^1.4.4",
    "cors": "^2.8.5",
    "dotenv": "^8.0.0",
    "express": "^4.17.0",
    "knex": "^0.16.5",
    "morgan": "^1.9.1",
    "path": "^0.12.7",
    "pg": "^7.11.0"
  ,
  "devDependencies": 
    "@babel/cli": "^7.4.4",
    "@babel/core": "^7.4.5",
    "@babel/node": "^7.4.5",
    "@babel/preset-env": "^7.4.5",
    "@babel/register": "^7.4.4",
    "chai": "^4.2.0",
    "mocha": "^6.1.4",
    "nodemon": "^1.19.0",
    "reify": "^0.19.1",
    "request": "^2.88.0"
  

ma​​in.js

import 'dotenv/config';
import cors from 'cors';
import express from 'express';
import logger from 'morgan';
import path from 'path';
import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser';
import userRoute from './routes/users';

const app = express();

app.use(cors());
app.use(logger('dev'));
// For React Stuff if need be
// app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'build')));
app.use(cookieParser());
app.use(bodyParser.json());

app.get('/', (req, res) => 
  res.send('Hello World!');
);

app.use('/users', userRoute);

app.use(() => (req, res, next)  =>
  res.locals.user = req.user; // This is the important line
  // req.session.user = user
  console.log(res.locals.user);
  next();
);
app.use(bodyParser.urlencoded( extended:false)); 

//build mode
// app.get('*', (req, res) => 
//   res.sendFile(path.join(__dirname+'/client/public/index.html'));
// )

app.listen(process.env.PORT, () =>
  console.log(`Example app listening on port $process.env.PORT!`),
);

export default app;

ma​​in.test.js

import chai from "chai"
import chaiHttp from 'chai-http';
import request from 'request';
import server from '../main';
const expect = chai.expect;
const should = chai.should();


chai.use(chaiHttp);

// should get / 

describe('should GET /',  () => 
    it('should get 200 status', (done) =>
        chai.request(server)
        .get('/')
        .end( (err, res) => 
            res.should.have.status(200);
            done();
        );
    );

)
// should check for Hello World!
describe('Should check for Hello World! text', () => 
    it('should check for hello world text', (done) =>
        chai.request(server)
        .get('/')
        .end( (err, res) => 
            expect(res.body).to.be.an('object') // works
            expect(res.text).to.equal('Hello World!')  // use res.text to check for res.send() text
            done();
        )
    )

)

【问题讨论】:

【参考方案1】:

main.js 中,将您的app.listen 调用放在!module.parent 的测试中,如下所示:

if(!module.parent)
  app.listen(process.env.PORT, () =>
    console.log(`Example app listening on port $process.env.PORT!`),
  );

来源:http://www.marcusoft.net/2015/10/eaddrinuse-when-watching-tests-with-mocha-and-supertest.html

【讨论】:

【参考方案2】:

较早的链接

if (!module.parent) 

自 v14.6.0、v12.19.0 起已弃用。 (documentation link)

一种解决方案是使用以下方法:

if (require.main === module) 

【讨论】:

【参考方案3】:

"testwatch": "nodemon --exec \"mocha --recursive\""

100% 将服务于您的目的,直到测试库发布更相关的内容

【讨论】:

【参考方案4】:

这看起来很老套,但对我有用的是确保对于每组测试,我都将使用不同的端口。

【讨论】:

【参考方案5】:

这意味着某些东西已经在端口 3000 上运行。您需要停止它,然后启动您的应用程序。或者只是将应用程序的端口更改为其他内容。

要释放 3000 端口,请使用:

fuser -k 3000/tcp

kill $(sudo lsof -t -i:3000)

更改应用程序的端口:

var port = 8000;
app.listen(port, () =>
  console.log(`Example app listening on port $port!`),
);

【讨论】:

谢谢,但这并不能解决问题,我试过了,问题仍然存在。请记住我正在使用 mochas --watch 功能。我希望能够在 npm test 运行时对代码进行编辑。我不想每次更改代码时都保留npm test

以上是关于未捕获的错误:在 mocha 单元测试时监听 EADDRINUSE:地址已在使用 :::3000的主要内容,如果未能解决你的问题,请参考以下文章

“未检测到侦听器”验证错误 Mongoose 和 Mocha

单元测试 mocha Visual Studio 代码描述未定义

mocha 单元测试中的 Highchart 导入错误

Mocha,应该 - 在测试具有承诺的异步函数时,断言错误是沉默的

使用 Mocha 测试 Promise 时发生错误

使用Vue组件的mocha进行单元测试时基类中的方法不存在