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

使用Nest与Jest测试AuthController时遭遇依赖解析错误求助

解决NestJS测试中AuthController依赖解析失败问题

问题根源

错误核心是测试模块未正确匹配并提供AuthController所需的全部依赖,具体两点:

  1. UserRepository注入标识不匹配:控制器通过@Inject(UserRepository.TOKEN)自定义令牌注入,但测试代码中误用了TypeORM的getRepositoryToken(UserRepository),导致Nest无法找到对应依赖。
  2. 缺失其他仓库依赖:控制器构造函数注入了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:24:13