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:构造函数注入了三个服务依赖,包含KeycloakUsersServiceKeycloakUsersService:构造函数注入KeycloakAdminClientService作为自身依赖KeycloakAdminClientService:提供Keycloak管理客户端相关功能的基础服务- 测试模块:当前直接引入
KeycloakUsersService,但未处理其依赖的KeycloakAdminClientService
解决方法
有两种常用处理方式:
完全模拟
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); });为
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
相关产品推荐
相关产品推荐

