node.js - Jest 测试多个测试文件端口 3000 已被使用

标签 node.js express mongoose jestjs supertest

我正在为我的 Express 应用创建测试。该项目有多个测试文件。在每个模块中,服务器实例在 beforeEach() 方法中是必需的,并在 afterEach() 方法中关闭。但是在测试了一个或两个模块之后,它会引发已经在使用的地址并且 jest 不会终止。

beforeEach(() =>  {

    server = require('./../../../bin/www')});
afterEach(async() => { 
    server.close();
    /**
     * database cleanup logic goes here.
     */

 });

我希望 jest 在所有测试套件完成后终止。

最佳答案

Jest 默认并行运行测试套件。但是,运行测试的机器只有一个端口 3000(或端口 4000 等)

这意味着如果您告诉您的应用程序监听一个端口,然后启动多个并发进程,将会发生端口冲突并且 Jest 将退出并显示 EADDRINUSE - port already in use

正如一些人已经提到的,您可以通过使用 --runInBand 按顺序运行测试来解决问题。但是,您将失去并行化的性能优势。

还有另一种方法......在运行测试时不要显式监听端口。

if (process.env.NODE_ENV !== 'test') {
  app.listen(port, () => console.log(`Listening on port ${port}`)
}

现在,当您将您的应用提供给 super 测试时,它将在端口 0 上运行您的应用,因为它尚未在端口上运行。

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

it('gets todos', async () => {
  const response = await request(app).get('/todos')
  expect(response.body.length).toEqual(3)
}

你问端口 0 到底是什么?这就是你告诉 Unix 机器的方式......

Choose the first randomly available port that you find.

现在每个测试套件都在随机可用的端口上运行,不再存在端口冲突的风险,这意味着我们已经解决了 EADDRINUSE - port already in use 错误,我们可以继续并行运行测试。

关于node.js - Jest 测试多个测试文件端口 3000 已被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54422849/

相关文章:

angularjs - angular-full stack 是如何像恶魔一样运行的?

javascript - 无法读取 Node.js 中未定义的属性 'get'

javascript - 通过索引将集合推送到子文档?

node.js - 实体元数据未找到 : Node. js TypeScript TypeORM

mysql - 迁移文件必须在 Sequelize 中吗?

reactjs - 如何连接 React 前端和 Express 后端?

mongodb - 如何按小时对数据进行分组

javascript - MongoDB 对同一集合进行多次查找

node.js - NodeJS 在 TypeScript 项目中上传文件时遇到问题

node.js - 如何在每次页面刷新时验证 session cookie 的完整性,应该如何处理?