节点 EADDRINUSE:使用 jest 和 supertest 进行测试时,地址已在使用 :::3000

and*_*541 7 javascript node.js supertest jestjs

我正在尝试使用 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()
    })
Run Code Online (Sandbox Code Playgroud)

索引.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}`)
})
Run Code Online (Sandbox Code Playgroud)

当我运行此测试时,我收到有关占用端口的错误:

listen EADDRINUSE: address already in use :::3000
Run Code Online (Sandbox Code Playgroud)

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

Avi*_* A. 13

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

if (process.env.NODE_ENV !== 'test') {
    app.listen(port);
}
Run Code Online (Sandbox Code Playgroud)

了解更多请阅读


小智 0

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