我正在尝试使用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
型
我如何解决这个问题,而不阻止我的端口进行测试?
4条答案
按热度按时间pvcm50d11#
这个问题实际上与你在测试环境中运行服务器的方式有关。解决这个问题的一个简单方法是将app.listen() Package 在一个条件中,以检查环境是否是测试环境。在测试环境中,当通过Supertest运行服务器时,你不需要让应用在网络端口上侦听。所以通过在index.js中添加一个条件检查来解决这个问题:
字符串
阅读更多this
nc1teljy2#
你的计算机上有其他的东西正在使用端口3000;这就是全部。只需将
port
变量设置为其他值; 8080和8000是流行的选择。zpjtge223#
在运行测试时,需要避免调用
app.listen()
。虽然将app.listen()
Package 在if
语句中可以工作,但也可以像这样组织代码:个字符
然后在您的测试中从
app.ts
导入app
,这避免了EADDRINUSE
问题。This answer在这方面添加了更多信息。
vxqlmq5t4#
如果你使用的是Linux,那么你可以使用
ss
。例如,您的端口已经被另一个应用程序绑定到
3000
,那么您可以使用以下命令列出当前绑定/具有从端口3000
侦听的开放套接字的所有应用程序:ss -ap | grep 3000
个您还将看到进程的名称沿着及其
pid
。记下不再需要的进程的进程ID,然后运行
kill -9 PID
来删除它。您需要删除绑定到端口
3000
的进程,以便能够启动绑定到它的新进程。最多只有一个进程可以将自己绑定到机器上的端口。