Jest27.5.1集成测试本地正常 CI流水线报ECONNREFUSED错误
Jest 27.5.1 集成测试CI环境ECONNREFUSED 127.0.0.1:80报错修复方案
这个报错的核心是测试代码在CI环境发起了指向本地80端口的真实网络请求,但CI执行测试阶段没有任何服务监听80端口,同时测试的mock配置、全局状态清理存在遗漏,造成跨用例状态污染,因此跳过单个报错用例也无法阻断后续异常。
按以下顺序排查修复:
- 补全测试前置服务启动逻辑
本地能跑通是因为你的开发环境本来就常驻了占用80端口的前端/后端服务,CI流水线是全新的干净环境,执行jest命令前不会自动启动你的业务服务。不要依赖本地常驻服务跑集成测试,在jest配置中增加globalSetup生命周期钩子,在所有测试执行前拉起待测试的业务服务,确认端口监听正常后再执行测试逻辑,测试全部执行完成后自动关闭拉起的服务,避免残留进程。
可以在CI脚本的jest执行步骤前插入curl -v http://127.0.0.1:80做快速校验,如果直接返回连接拒绝,即可确认80端口无服务监听的基础问题。 - 修复Mock服务的拦截规则
你在afterEach中添加的server.resetHandlers()仅能重置已注册的mock handler,无法拦截未声明mock规则的透传请求:- 先对齐Mock服务的生命周期:在
beforeAll中执行服务启动逻辑,afterAll中执行服务关闭逻辑,afterEach中除了重置handler,还要恢复所有请求的默认拦截行为 - 给Mock服务启动参数增加未匹配请求的拦截规则,所有没有对应mock规则的请求直接抛出明确错误,禁止透传发送真实网络请求,从根源上避免请求打到不存在的本地80端口。加完这个配置后,可以直接定位到是哪段代码发了未被mock的
/callback?usid=请求。
- 先对齐Mock服务的生命周期:在
- 解决全局状态跨用例泄漏问题
跳过第一个报错用例后后续用例依然报错,说明存在测试文件顶层、或者前序用例初始化的全局实例没有被正确清理:- 重点排查SSO/认证相关SDK的初始化逻辑:报错路径
/callback?usid=是典型的登录回调请求,大概率是SDK在文件加载阶段就直接初始化,自动发起了回调请求,和单个测试用例是否跳过无关。测试环境下需要mock掉SDK的自动初始化逻辑,不要触发真实的回调请求发送。 - 确认Jest的testEnvironment配置:Jest 27.x版本默认测试环境是node,如果你测试的是前端代码,需要手动把测试环境改成
jsdom,否则你写的LocalStorage.clear()运行在node上下文,根本清不掉浏览器环境的缓存,残留的登录态、配置信息会跨用例持续生效,触发异常请求。 - 不要在测试文件顶层初始化会发起网络请求的业务实例,所有实例初始化逻辑放到
beforeEach中,在afterEach中手动销毁实例,避免跨用例残留。
- 重点排查SSO/认证相关SDK的初始化逻辑:报错路径
不要通过修改业务代码里的API请求地址来适配测试环境,这种方式会掩盖真实的请求逻辑问题,后续上线很容易出现环境配置类故障。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

