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

NestJS单元测试中服务依赖注入问题求助

NestJS单元测试依赖注入问题排查

我在测试带有三个依赖的UsersService时遇到了问题:其中KeycloakUsersService自身还依赖KeycloakAdminClientService,按照当前测试模块的写法模拟KeycloakUsersService时,抛出了以下错误:

Nest can't resolve dependencies of the KeycloakUsersService (?). Please make sure that the argument KeycloakAdminClientService at index [0] is available in the RootTestModule context.

相关代码结构说明

  • UsersService:构造函数注入了三个服务依赖,包含KeycloakUsersService
  • KeycloakUsersService:构造函数注入KeycloakAdminClientService作为自身依赖
  • KeycloakAdminClientService:提供Keycloak管理客户端相关功能的基础服务
  • 测试模块:当前直接引入KeycloakUsersService,但未处理其依赖的KeycloakAdminClientService

解决方法

有两种常用处理方式:

  1. 完全模拟KeycloakUsersService
    不需要引入真实的KeycloakUsersService,用Jest模拟它的方法实现,跳过内部依赖的处理:

    beforeEach(async () => {
      const moduleRef = await Test.createTestingModule({
        providers: [
          UsersService,
          {
            provide: KeycloakUsersService,
            useValue: {
              // 按需模拟需要用到的方法,例如:
              findUserById: jest.fn().mockResolvedValue({ id: 'test-id', name: 'test-user' })
            }
          },
          // 配置另外两个依赖的模拟或实例
        ],
      }).compile();
    
      usersService = moduleRef.get<UsersService>(UsersService);
    });
    
  2. 为KeycloakUsersService提供依赖模拟
    如果必须使用真实的KeycloakUsersService,则需要在测试模块中补充它依赖的KeycloakAdminClientService(模拟即可):

    beforeEach(async () => {
      const moduleRef = await Test.createTestingModule({
        providers: [
          UsersService,
          KeycloakUsersService,
          {
            provide: KeycloakAdminClientService,
            useValue: {
              // 模拟该服务的核心方法,例如:
              getClient: jest.fn().mockResolvedValue({})
            }
          },
          // 配置另外两个依赖的模拟或实例
        ],
      }).compile();
    
      usersService = moduleRef.get<UsersService>(UsersService);
    });
    

问题核心原因

Nest测试模块会自动解析所有声明服务的依赖链,当你在测试模块中引入KeycloakUsersService时,它会尝试寻找其依赖的KeycloakAdminClientService,如果未提供该服务的实例或模拟对象,就会触发依赖解析失败的错误。

内容的提问来源于stack exchange,提问作者lenphatos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:20:54