NestJS+Fastify e2e测试遇Jest未正常退出及接口返回404问题
NestJS+Fastify 端到端测试异常问题根因
两个现象的关联逻辑
--detectOpenHandles 本身不会修改应用的接口逻辑,它的作用是开启Jest的异步资源追踪能力,会改变测试运行的时序逻辑,暴露原本被异步等待容错掩盖的代码问题。
具体原因及修复方案
- Fastify 实例初始化不完全
这是最常见的触发原因:NestJS封装Fastify时,路由注册、中间件加载都需要异步完成,必须显式等待初始化流程完全结束才能发起测试请求。你按照官方文档编写时大概率遗漏了fastify.ready()的等待逻辑,未加参数时Jest的默认1秒超时容错刚好等初始化完成,加参数后追踪逻辑占用了部分等待窗口,导致路由还没注册完成就发起了GET /cats请求,返回404。
正确初始化代码参考:import { Test } from '@nestjs/testing'; import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; import { AppModule } from './../src/app.module'; describe('AppController (e2e)', () => { let app: NestFastifyApplication; beforeEach(async () => { const moduleFixture = await Test.createTestingModule({ imports: [AppModule], }).compile(); app = moduleFixture.createNestApplication<NestFastifyApplication>( new FastifyAdapter(), ); // 等待Nest初始化完成 await app.init(); // 等待Fastify实例注册完全部路由、钩子 await app.getHttpAdapter().getInstance().ready(); }); afterEach(async () => { // 关闭实例释放句柄,解决Jest不退出的警告 await app.close(); }); it('/cats (GET)', () => { return app.inject({ method: 'GET', url: '/cats', }).then(res => { expect(res.statusCode).toBe(200); }); }); }); - 测试清理逻辑缺失
Jest不退出的警告直接原因是测试结束后没有关闭Fastify实例,连接句柄持续驻留,补充上述代码中afterEach里的app.close()逻辑即可解决。 - 路由路径匹配错误
如果开启了全局路由前缀,或者Controller的路由前缀配置和测试请求的路径不匹配,也会触发404,需要检查测试中请求的路径和实际路由配置是否完全一致。
内容的提问来源于stack exchange,提问作者Daniel Kucal
相关产品推荐
相关产品推荐

