我正在为我的 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/