Node EADDRINUSE:address already in use:3000 when testing with jest and supertest

huwehgph  于 11个月前  发布在  Jest
关注(0)|答案(4)|浏览(149)

我正在尝试使用jest和supertest测试我的API端点:
我的测试路由文件:

const app = require('../../index') 
const request = require('supertest')

describe('test app endpoints', ()=>{
    test('index should return 200 code', async (done) =>{
        const response = await request(app).get('/')
        expect(response.statusCode).toBe(200)
        done()
    })

字符串
index.js:

const express = require('express')
const bodyParser = require('body-parser')
const app = express()

const port = 3000

app.set('view engine', 'ejs')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
    extended: true
}));

app.use('/', require('./routes/conversions'))

module.exports = app.listen(port, (err) => {
    if (err) throw err
    console.log(`Server is running on port ${port}`)
})


当我运行这个测试时,我得到了关于占用端口的错误:

listen EADDRINUSE: address already in use :::3000


我如何解决这个问题,而不阻止我的端口进行测试?

pvcm50d1

pvcm50d11#

这个问题实际上与你在测试环境中运行服务器的方式有关。解决这个问题的一个简单方法是将app.listen() Package 在一个条件中,以检查环境是否是测试环境。在测试环境中,当通过Supertest运行服务器时,你不需要让应用在网络端口上侦听。所以通过在index.js中添加一个条件检查来解决这个问题:

if (process.env.NODE_ENV !== 'test') {
    app.listen(port);
}

字符串
阅读更多this

nc1teljy

nc1teljy2#

你的计算机上有其他的东西正在使用端口3000;这就是全部。只需将port变量设置为其他值; 8080和8000是流行的选择。

zpjtge22

zpjtge223#

在运行测试时,需要避免调用app.listen()。虽然将app.listen() Package 在if语句中可以工作,但也可以像这样组织代码:

// app.ts

import express from 'express'
import { router } from './router'

const app = express()

app.use(express.json())
app.use('/api', router)
// more setup here...

export { app }

个字符
然后在您的测试中从app.ts导入app,这避免了EADDRINUSE问题。
This answer在这方面添加了更多信息。

vxqlmq5t

vxqlmq5t4#

如果你使用的是Linux,那么你可以使用ss
例如,您的端口已经被另一个应用程序绑定到3000,那么您可以使用以下命令列出当前绑定/具有从端口3000侦听的开放套接字的所有应用程序:
ss -ap | grep 3000
您还将看到进程的名称沿着及其pid
记下不再需要的进程的进程ID,然后运行kill -9 PID来删除它。
您需要删除绑定到端口3000的进程,以便能够启动绑定到它的新进程。
最多只有一个进程可以将自己绑定到机器上的端口。

相关问题