使用Nest与Jest测试AuthController时遭遇依赖解析错误求助
解决NestJS测试中AuthController依赖解析失败问题
问题根源
错误核心是测试模块未正确匹配并提供AuthController所需的全部依赖,具体两点:
- UserRepository注入标识不匹配:控制器通过
@Inject(UserRepository.TOKEN)自定义令牌注入,但测试代码中误用了TypeORM的getRepositoryToken(UserRepository),导致Nest无法找到对应依赖。 - 缺失其他仓库依赖:控制器构造函数注入了
TokenRepository和ChallengeRepository,但测试模块的providers中完全未配置这两个依赖的mock实现。
修复步骤
1. 导入缺失的仓库类
在测试文件顶部补充导入TokenRepository和ChallengeRepository:
import {TokenRepository} from '@lib/database/identity/repository/token.repository'; import {ChallengeRepository} from '@lib/database/identity/repository/challenge.repository';
2. 修正UserRepository的提供标识
将测试中getRepositoryToken(UserRepository)替换为UserRepository.TOKEN,与控制器注入的自定义令牌保持一致。
3. 添加缺失仓库的mock实现
在providers数组中新增TokenRepository和ChallengeRepository的mock配置,同样使用它们各自的自定义TOKEN作为provide值。
完整修复后的测试代码
import {AuthController} from './auth.controller'; import {Test, TestingModule} from '@nestjs/testing'; import {ResetService} from '../service/reset.service' import {LocalStrategy} from '../strategy/local.strategy'; import {UserRepository} from '@lib/database/identity/repository/user.repository'; import {TokenRepository} from '@lib/database/identity/repository/token.repository'; import {ChallengeRepository} from '@lib/database/identity/repository/challenge.repository'; describe('Auth Controller', () => { let controller: AuthController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [AuthController], providers: [ { provide: ResetService, useValue: {}, }, { provide: LocalStrategy, useValue: {}, }, { // 匹配控制器的自定义注入令牌 provide: UserRepository.TOKEN, useValue: { find: jest.fn(), insert: jest.fn(), } }, { provide: TokenRepository.TOKEN, useValue: { // 根据后续测试需求扩展mock方法 save: jest.fn(), findOne: jest.fn(), } }, { provide: ChallengeRepository.TOKEN, useValue: { // 根据后续测试需求扩展mock方法 create: jest.fn(), findOne: jest.fn(), } } ] }).compile(); controller = module.get<AuthController>(AuthController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });
额外说明
- 后续测试控制器具体方法时,可在
useValue中扩展对应mock函数的逻辑,比如设置返回值、模拟异常等。 - 若依赖是通过自定义令牌注入的(即使用
@Inject(xxx.TOKEN)),测试时必须使用相同的令牌作为provide值,不要混用TypeORM的getRepositoryToken(该方法仅适用于通过TypeOrmModule.forFeature注册的仓库)。
内容的提问来源于stack exchange,提问作者Felipe Briga
相关产品推荐
相关产品推荐

