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

NestJS单元测试:无法通过.get获取中间件的问题求助

解决Nest中无法通过app.get获取BodyParserMiddleware的问题

问题原因

你遇到的报错核心原因是:通过MiddlewareConsumer.apply()注册的中间件不属于Nest依赖注入容器的常规Provider。这类中间件仅被Nest用于路由请求处理,不会被注入到容器中,因此app.get(BodyParserMiddleware)无法找到对应的实例。

另外,app.get(FeaturesModule)返回FeaturesModule {}是正常现象——Nest容器中存储的是模块类本身而非实例,所以获取到的是类的空对象表示。

解决方案

针对中间件的测试,推荐两种实用方式:

1. 直接单元测试中间件(无需启动整个应用)

中间件本质是包含use()方法的类,你可以直接实例化它,模拟请求、响应和next函数来测试核心逻辑,这是轻量化的纯单元测试方案:

import { BodyParserMiddleware } from '../../../src/config/body-parser/body-parser.middleware';

describe('BodyParserMiddleware', () => {
  let middleware: BodyParserMiddleware;

  beforeEach(() => {
    // 若中间件有依赖,此处传入Mock的依赖实例即可
    middleware = new BodyParserMiddleware();
  });

  it('should process request and trigger next', () => {
    // 模拟请求、响应对象(根据中间件逻辑补充必要属性)
    const mockReq = {
      rawBody: Buffer.from('test-body-content'),
      headers: { 'content-type': 'application/json' }
    };
    const mockRes = {};
    const mockNext = jest.fn();

    // 执行中间件逻辑
    middleware.use(mockReq, mockRes, mockNext);

    // 编写断言逻辑
    expect(mockNext).toHaveBeenCalled();
    // 若中间件修改了请求体,可添加对应断言
    // expect(mockReq.body).toEqual({ /* 预期处理结果 */ });
  });
});

2. 将中间件注册为Provider(适用于需要容器的集成测试)

如果必须在应用容器中获取中间件实例,可以在测试模块中手动将其注册为Provider,让app.get()能够找到它:

import { Test } from '@nestjs/testing';
import { BodyParserMiddleware } from '../../../src/config/body-parser/body-parser.middleware';
import { AppModule } from '../../../src/app.module';

describe('CatsController', () => {
  let app;

  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
      providers: [BodyParserMiddleware], // 手动注册为容器Provider
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init(); // 必须调用init()启动应用
  });

  afterAll(async () => {
    await app.close();
  });

  it('should retrieve BodyParserMiddleware from container', () => {
    const middleware = app.get(BodyParserMiddleware);
    expect(middleware).toBeInstanceOf(BodyParserMiddleware);
  });
});

注意:这种方式会启动完整应用模块,更适合集成测试场景,而非纯单元测试。

内容的提问来源于stack exchange,提问作者juli1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:25:37