NestJS使用Jest执行单元测试时依赖注入异常问题求助
解决NestJS单元测试中Jest无法解析CACHE_MANAGER依赖的问题
你的问题根源很明确:在单元测试的RootTestModule里,你只声明了AppService作为提供者,但AppService依赖的CACHE_MANAGER并没有被注册到测试模块中,所以Nest没办法自动注入它。下面给你两种实用的解决思路,你可以根据测试需求选择:
方法一:模拟(Mock)CACHE_MANAGER(推荐单元测试使用)
单元测试的核心是隔离被测对象(这里是AppService),不需要依赖真实的缓存服务。我们可以手动模拟一个CACHE_MANAGER的实现,让Nest能够完成注入:
修改你的app.controller.spec.ts文件,在providers数组中添加CACHE_MANAGER的模拟提供者:
import { Test, TestingModule } from '@nestjs/testing'; import { AppController } from './app.controller'; import { AppService } from './app.service'; // 别忘了导入CACHE_MANAGER import { CACHE_MANAGER } from '@nestjs/common'; describe('AppController', () => { let appController: AppController; beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ controllers: [AppController], providers: [ AppService, { provide: CACHE_MANAGER, // 模拟缓存管理器的常用方法,如果你的Service用到了其他方法,也需要在这里添加模拟 useValue: { get: jest.fn(), set: jest.fn(), del: jest.fn(), }, }, ], }).compile(); appController = app.get<AppController>(AppController); }); describe('root', () => { it('should return "Hello World!"', () => { expect(appController.getHello()).toBe('Hello World!'); }); }); });
这种方式的优势在于完全隔离了外部依赖,测试速度快,而且后续如果需要测试缓存相关逻辑,还可以通过jest.fn()的断言方法,验证缓存方法是否被正确调用。
方法二:使用真实的CacheModule(适合集成测试)
如果你需要在测试中使用真实的缓存功能(比如测试缓存读写逻辑),可以直接在测试模块中导入CacheModule并注册:
import { Test, TestingModule } from '@nestjs/testing'; import { AppController } from './app.controller'; import { AppService } from './app.service'; // 导入CacheModule import { CacheModule } from '@nestjs/common'; describe('AppController', () => { let appController: AppController; beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ controllers: [AppController], providers: [AppService], // 注册CacheModule,这里可以根据需要配置缓存存储(比如内存、Redis等) imports: [CacheModule.register()], }).compile(); appController = app.get<AppController>(AppController); }); describe('root', () => { it('should return "Hello World!"', () => { expect(appController.getHello()).toBe('Hello World!'); }); }); });
注意:这种方式会启动真实的缓存服务,更适合集成测试场景,单元测试一般推荐使用方法一的模拟方式。
内容的提问来源于stack exchange,提问作者Howard Scott
相关产品推荐
相关产品推荐

