1
votes

Erreur non interceptée: écoute EADDRINUSE: adresse déjà utilisée ::: 3000 lors du test d'unité moka

J'obtiens cette erreur lors du test unitaire du code,

2 réussites (14ms) 1 échec

1) Erreur non interceptée en dehors de la suite de tests: Erreur non interceptée: écoute EADDRINUSE: adresse déjà utilisée ::: 3000 à Server.setupListenHandle [as _listen2] (net.js: 1255: 14) à listenInCluster (net.js: 1303: 12) sur Server.listen (net.js: 1391: 7) à Function.listen (node_modules / express / lib / application.js: 618: 24) sur Object.listen (main.js: 39: 5) à Module._compile (interne / modules / cjs / loader.js: 721: 30) à Module._compile (node_modules / pirates / lib / index.js: 99: 24) à Module._extensions..js (interne / modules / cjs / loader.js: 732: 10) à Object.newLoader [as .js] (node_modules / pirates / lib / index.js: 104: 7) à Module.load (interne / modules / cjs / loader.js: 620: 32) à tryModuleLoad (interne / modules / cjs / loader.js: 560: 12) à Function.Module._load (internal / modules / cjs / loader.js: 552: 3) à Module.require (interne / modules / cjs / loader.js: 657: 17) à require (interne / modules / cjs / helpers.js: 22: 18) à Object. (test / main.test.js: 4: 1) à Module._compile (interne / modules / cjs / loader.js: 721: 30) à Module._compile (node_modules / pirates / lib / index.js: 99: 24) à Module._extensions..js (interne / modules / cjs / loader.js: 732: 10) à Object.newLoader [as .js] (node_modules / pirates / lib / index.js: 104: 7) à Module.load (interne / modules / cjs / loader.js: 620: 32) à tryModuleLoad (interne / modules / cjs / loader.js: 560: 12) à Function.Module._load (internal / modules / cjs / loader.js: 552: 3) à Module.require (interne / modules / cjs / loader.js: 657: 17) à require (interne / modules / cjs / helpers.js: 22: 18) à Array.forEach () sur StatWatcher.onchange (interne / fs / watchers.js: 50: 8)

J'utilise moka , et j'ai --watch sur mon package.json. J'utilise une approche es6 pour exprimer.

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();
        })
    })

})

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;

{
  "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"
  }
}


0 commentaires

3 Réponses :


-1
votes

Cela signifie que quelque chose tourne déjà sur le port 3000. Vous devez arrêter cela, puis démarrer votre application. Ou changez simplement le port de votre application en autre chose.

Pour libérer le port 3000, utilisez:

fuser -k 3000 / tcp

ou

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

Pour changer le port de votre application:

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


1 commentaires

merci mais cela ne résout pas le problème, j'ai essayé cela, le problème persiste. Gardez à l'esprit que j'utilise la fonction mochas --watch. Je souhaite pouvoir modifier le code pendant l'exécution du test npm. Je ne veux pas conserver le test npm chaque fois que je change de code.



5
votes

Dans main.js , placez votre appel app.listen dans un test pour ! module.parent , comme ceci:

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

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


0 commentaires

0
votes

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

servira à 100% votre objectif jusqu'à ce que la bibliothèque de test publie quelque chose de plus pertinent


0 commentaires