Jest 测试多个测试文件端口 3000 已被使用

Jest testing multiple test file port 3000 already in use

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

beforeEach(() =>  {

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

 });

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

我遇到了这个问题,似乎通过将 jest 设置为仅使用一名工人来解决它。我认为问题是由多个服务器 运行 同一端口实例引起的,从而导致冲突。

这是我的 npm package.json 文件中的行。 --maxWorkers=1 似乎成功了 (https://jestjs.io/docs/en/cli#maxworkers-num-string)。

"scripts": {
  "test": "jest --forceExit --detectOpenHandles  --watchAll --maxWorkers=1"
},

还有一个选项--运行InBand to 运行 一个一个测试。

我正在使用 Node Express 服务器 4.16.2。如果您使用的是其他版本,这可能不适用于您。 在您关闭服务器时的描述块中,await

describe('auth midleware', () => {
        // loading the server
        beforeEach(() => {>         
            server = require('../../../index')
        });

        // closing the server
        afterEach(async () => {
            await server.close();        
        });


        // the tests will go here
    });

此外,在您执行此操作后,运行 您在命令行中的节点应用程序。

node index.js

检查您的 package.json,您的脚本测试标签是如何命名的。我的是测试。

{ ...
      "scripts": {
        "test": "jest --verbose --coverage --forceExit --watchAll --maxWorkers=1"
      }
      ...
    }

之后 运行 再次测试。

npm test  

我遇到了同样的问题,事实证明最后一个测试用例在移动到下一个测试套件之前不允许 jest 正确关闭,所以我添加了

it('should blah blah', asyn(done) => {
   test code...
   done()
})

最基本的做法是将 app.listen() 放入其他文件中,而不是包含所有路由的文件中。 例如 : index.js

const express = require("express");
const app = express();
const bodyParser = require("body-parser");

app.use(bodyParser.json());

const students = ["Elie", "Matt", "Joel", "Michael"];

app.get("/", (req, res) => {
  return res.json(students);
});

module.exports = app;

和server.js

const app = require("./index");

app.listen(3000, () => console.log("server starting on port 3000!"));

这样 Jest 就不会读取 app.listen() 了。干杯!

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

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

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

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

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

现在,当您将您的应用程序提供给超级测试时,它会运行您的应用程序在端口 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 错误,我们可以继续 运行并行测试。

server = require('./../../../bin/www')});
afterEach(async() => { 
   await server.close();

您刚刚等待正确关闭服务器。