Node.js集成测试报错:ECONNREFUSED及Jest环境销毁后导入文件问题
问题描述
我正在学习Code with Mosh的Node.js课程,目前处于集成测试模块。运行以下测试代码时遇到两类错误:
connect ECONNREFUSED 127.0.0.1:80ReferenceError: You are trying to import a file after the Jest environment has been torn down(错误来自tests/integration/genres.test.js)
测试代码:
const request = require('supertest'); let server; describe('api/genres', () => { beforeEach(() => { server = require('../../app'); }); afterEach(async() => { await server.close(); }); describe('GET/', () => { it('should return all the genres', async () => { const res = await request(server).get('api/genres'); expect(res.status).toBe(200); }); }); });
解决方案
1. 修复connect ECONNREFUSED 127.0.0.1:80错误
错误核心是请求路径缺少开头的斜杠/,supertest会将无开头斜杠的路径视为绝对路径,默认尝试连接80端口,而非你的应用服务。
修改测试中的请求路径,添加开头的/:
const res = await request(server).get('/api/genres'); // 路径以/开头
2. 修复ReferenceError: You are trying to import a file after the Jest environment has been torn down错误
这个问题源于模块缓存和服务器资源未彻底释放,可通过以下两种方式解决:
方式一:清理模块缓存+确保服务器关闭
在afterEach中清除app.js的模块缓存,避免重复require时复用旧实例:
afterEach(async () => { await server.close(); // 清除app模块的缓存 delete require.cache[require.resolve('../../app')]; });
方式二:全局启动/关闭服务器
将服务器的启动和关闭移到beforeAll和afterAll,而非每个测试用例都重启,减少资源冲突:
const request = require('supertest'); let server; // 所有测试前启动一次服务器 beforeAll(() => { server = require('../../app'); }); // 所有测试结束后关闭并清理缓存 afterAll(async () => { await server.close(); delete require.cache[require.resolve('../../app')]; }); describe('api/genres', () => { describe('GET/', () => { it('should return all the genres', async () => { const res = await request(server).get('/api/genres'); expect(res.status).toBe(200); }); }); });
注意:确保你的
app.js导出的是http.createServer()返回的服务器实例,如果导出的是express app,需要先创建服务器再导出,例如:// app.js const express = require('express'); const app = express(); // ... 路由和中间件配置 const server = app.listen(3000); module.exports = server;
内容的提问来源于stack exchange,提问作者Navpreet Singh Sidhu
相关产品推荐
相关产品推荐

