解决 Jest 测试时端口一直被占用错误

  • Node.js
  • 梁凤波
  • 660
  • 11

遇到的问题

在给 node 项目做单元测试接口时,使用了 jest 测试,当运行 npm run test 时报错:

> jest _tests  --forceExit --runInBand --colors

 FAIL  _tests/api/admin.test.js
  ● 测试管理员注册,按正确的发送参数,测试结果应该注册成功

    listen EADDRINUSE: address already in use :::3000

      21 | InitManager.initCore(app)
      22 |
    > 23 | app.listen(3000, () => {
         |     ^
      24 |   console.log('Koa is listening in http://localhost:3000')
      25 | })
      26 |
...

排查过程,思考应该是端口被占用了,但我已经配置了 --runInBand 配置,按道理应该不会存在这个错误,但还是提示该错误。

—runInBand:可能运行了两个 Koa 实例导致了监听端口的冲突,所以我们需要让 Jest 按顺序执行。

继续查看了官方文档,说在异步调用完后,在异步调用函数后传入 done 函数,执行完毕后结束该进程。

test('测试使用正确的 token 获取管理员信息,测试结果应该成功', async (done) => {
  const token = getToken()
  const res = await server.get('/api/v1/admin/auth')
    .auth(token, {type: "basic"})

  expect(res.status).toBe(200)
  expect(res.body.data.nickname).toBe(nickname)
  expect(res.body.data.email).toBe(email)
  expect(res.body.data.password).toBeUndefined
  done()
})

按正常来说,应该也是可以的了,但很不巧,也同端口被占用的错误,最后拿出了神器,去 Google 一搜,进入了 jest 的GitHub supertest issues 果然有各路大佬的解决方案,地址是:Supertest iisues 568

解决方案是:

lsof -i:3000 
kill -9 [PID]

简单说,查看当前的 3000 端口的 pid,然后"抹掉"这个进程。

最后帅气执行测试命令,顺利通过!

➜  nodejs-koa-blog git:(master) ✗ npm run test

> nodejs-koa2-blog@1.0.0 test /Users/bobobo/Documents/myproject/nodejs-koa-blog
> jest _tests  --forceExit --runInBand --colors

 PASS  _tests/api/admin.test.js
  ● Console

    console.log app.js:24
      Koa is listening in http://localhost:3000

 PASS  _tests/dao/admindao.test.js

Test Suites: 2 passed, 2 total
Tests:       10 passed, 10 total
Snapshots:   0 total
Time:        2.924s, estimated 3s
Ran all test suites matching /_tests/i.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?
➜  nodejs-koa-blog git:(master) ✗

最后,我思考突然想到,我在测试时候,不仅在命令行里面进行 run test,还在 webstrom 里面单独进行 run 测试,不知道是否因为启动了多个进程,我决定重现一次这样的操作是否会出现同样的结果。

  • 我先执行了一次 npm run test 测试没问题;
  • 然后我在 webstrom 里面进行单独一个函数 Run 测试,测试通过,关闭。
  • 再一次执行 npm run test,果然出现了同样的端口被占用问题。

找到了问题的根源后,同样使用解决方案即可。

lsof -i:3000 
kill -9 [PID]
欢迎评论
评论列表
avatar

00011

111
...

来自「00022」的回复

123
avatar

00000000

00000000

avatar

aff

0000000000000

avatar

aff

000000

avatar

ss's's's's

ss

avatar

1231

qweq

avatar

test111111

qwkeqweqweqweqweqweqweqwe

avatar

1

1123

avatar

ww

ww3

avatar

波波云

湖广会馆
...

来自「波波云」的回复

和规范化
...

来自「伊人用爱捉」的回复

test
TOP