Nest.js与Jest测试报错:无法解析AuthGuard依赖求助
解决Nest.js中RecoveryController的Jest测试依赖注入问题
问题根源
测试模块仅声明了RecoveryController,但控制器(或其依赖的服务)依赖AuthGuard,而AuthGuard需要JwtService;添加RecoveryService后,又因RecoveryService依赖ConfirmationHashService、CryptographicService、UsersService等未在测试模块中提供,导致依赖解析失败。
解决方案1:直接导入RecoveryModule(推荐)
RecoveryModule已配置好所有必要的导入与提供者,测试时直接导入该模块即可,无需手动声明控制器和服务:
import { Test, TestingModule } from '@nestjs/testing'; import { RecoveryController } from './recovery.controller'; import { RecoveryModule } from './recovery.module'; describe('RecoveryController', () => { let controller: RecoveryController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [RecoveryModule], }).compile(); controller = module.get<RecoveryController>(RecoveryController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });
若遇到配置相关错误(如ApiConfigService缺少环境变量),可模拟配置服务:
import { Test, TestingModule } from '@nestjs/testing'; import { RecoveryController } from './recovery.controller'; import { RecoveryModule } from './recovery.module'; import { ApiConfigService } from '../config/api-config.service'; describe('RecoveryController', () => { let controller: RecoveryController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [RecoveryModule], }) .overrideProvider(ApiConfigService) .useValue({ jwtAuthConfig: { secret: 'test-secret' }, }) .compile(); controller = module.get<RecoveryController>(RecoveryController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });
解决方案2:模拟所有依赖服务(单元测试场景)
若需隔离外部依赖做单元测试,可模拟所有被依赖的服务及守卫:
import { Test, TestingModule } from '@nestjs/testing'; import { RecoveryController } from './recovery.controller'; import { RecoveryService } from './recovery.service'; import { ConfirmationHashService } from '../confirmation-hash/confirmation-hash.service'; import { CryptographicService } from '../cryptographic/cryptographic.service'; import { UsersService } from '../users/users.service'; import { JwtService } from '@nestjs/jwt'; import { AuthGuard } from '@nestjs/passport'; describe('RecoveryController', () => { let controller: RecoveryController; beforeEach(async () => { // 模拟所有依赖服务 const mockRecoveryService: Partial<RecoveryService> = {}; const mockConfirmationHashService: Partial<ConfirmationHashService> = {}; const mockCryptographicService: Partial<CryptographicService> = {}; const mockUsersService: Partial<UsersService> = {}; const mockJwtService: Partial<JwtService> = {}; const module: TestingModule = await Test.createTestingModule({ controllers: [RecoveryController], providers: [ { provide: RecoveryService, useValue: mockRecoveryService }, { provide: ConfirmationHashService, useValue: mockConfirmationHashService }, { provide: CryptographicService, useValue: mockCryptographicService }, { provide: UsersService, useValue: mockUsersService }, { provide: JwtService, useValue: mockJwtService }, ], }) .overrideGuard(AuthGuard('jwt')) // 替换实际守卫为模拟实现 .useValue({ canActivate: jest.fn(() => true) }) .compile(); controller = module.get<RecoveryController>(RecoveryController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });
核心说明
- 直接导入
RecoveryModule能保证测试环境与生产环境依赖结构一致,避免手动维护依赖的繁琐。 - 模拟服务适合聚焦控制器逻辑的单元测试,需确保所有被依赖的对象都被正确模拟。
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

