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
相关产品推荐
相关产品推荐

