Reputation: 1362
I'm getting this error when unit testing code,
2 passing (14ms) 1 failing
1) Uncaught error outside test suite: Uncaught Error: listen EADDRINUSE: address already in use :::3000 at Server.setupListenHandle [as _listen2] (net.js:1255:14) at listenInCluster (net.js:1303:12) at Server.listen (net.js:1391:7) at Function.listen (node_modules/express/lib/application.js:618:24) at Object.listen (main.js:39:5) at Module._compile (internal/modules/cjs/loader.js:721:30) at Module._compile (node_modules/pirates/lib/index.js:99:24) at Module._extensions..js (internal/modules/cjs/loader.js:732:10) at Object.newLoader [as .js] (node_modules/pirates/lib/index.js:104:7) at Module.load (internal/modules/cjs/loader.js:620:32) at tryModuleLoad (internal/modules/cjs/loader.js:560:12) at Function.Module._load (internal/modules/cjs/loader.js:552:3) at Module.require (internal/modules/cjs/loader.js:657:17) at require (internal/modules/cjs/helpers.js:22:18) at Object. (test/main.test.js:4:1) at Module._compile (internal/modules/cjs/loader.js:721:30) at Module._compile (node_modules/pirates/lib/index.js:99:24) at Module._extensions..js (internal/modules/cjs/loader.js:732:10) at Object.newLoader [as .js] (node_modules/pirates/lib/index.js:104:7) at Module.load (internal/modules/cjs/loader.js:620:32) at tryModuleLoad (internal/modules/cjs/loader.js:560:12) at Function.Module._load (internal/modules/cjs/loader.js:552:3) at Module.require (internal/modules/cjs/loader.js:657:17) at require (internal/modules/cjs/helpers.js:22:18) at Array.forEach () at StatWatcher.onchange (internal/fs/watchers.js:50:8)
I'm using mocha, and i have --watch
on my package.json. I'm using an es6 approach to express.
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"
}
}
main.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;
main.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();
})
})
})
Upvotes: 4
Views: 10066
Reputation:
The earlier linked
if (!module.parent) {
is deprecated as of v14.6.0, v12.19.0. (documentation link)
One solution is to use the following:
if (require.main === module) {
Upvotes: 5
Reputation: 4566
This looks very hacky, but what worked for me was making sure that, for every suite of tests, I would be using a different port.
Upvotes: 0
Reputation: 11027
"testwatch": "nodemon --exec \"mocha --recursive\""
will 100%
server your purpose until test library posts something more relevant
Upvotes: 0
Reputation: 1147
In main.js
, place your app.listen
call inside a test for !module.parent
, like this:
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
Upvotes: 8
Reputation: 168
It means that something is running on port 3000 already. You need to stop that and then start your application. Or just change the port of your application to something else.
To free up port 3000 use :
fuser -k 3000/tcp
or
kill $(sudo lsof -t -i:3000)
To change the port of your application :
var port = 8000;
app.listen(port, () =>
console.log(`Example app listening on port ${port}!`),
);
Upvotes: -1