You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:45:08