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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:37:07