NestJS+TypeORM+Postgres测试报错:无法解析UsersService依赖
NestJS测试报错:无法解析UsersService的UserRepository依赖
报错信息
Nest can't resolve dependencies of the UsersService (?). Please make sure that the argument "UserRepository" at index [0] is available in the RootTestModule context。
问题根源
UsersService通过@InjectRepository(User)注入了TypeORM的UserRepository,但编写测试时,users.controller.spec.ts的测试模块既没有导入TypeOrmModule来提供真实仓库实例,也没有创建模拟仓库对象,导致Nest无法找到该依赖项。
解决方法
方案1:导入TypeOrmModule(集成测试场景)
如果需要测试真实的数据库操作逻辑,在测试模块的imports中添加TypeOrmModule.forFeature([User]),同时确保测试环境配置了独立的测试数据库:
import { Test, TestingModule } from '@nestjs/testing'; import { UsersController } from '../../../../src/modules/users/users.controller'; import { UsersService } from '../../../../src/modules/users/users.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from '../../../../src/entities/users.entity'; // 假设测试数据库配置在test-db.config.ts中 import { testDbConfig } from '../test-db.config'; describe('UserController', () => { let controller: UsersController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [ TypeOrmModule.forRoot(testDbConfig), TypeOrmModule.forFeature([User]), ], controllers: [UsersController], providers: [UsersService], }).compile(); controller = module.get<UsersController>(UsersController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });
方案2:模拟UserRepository(单元测试场景)
如果仅需测试控制器与服务的业务逻辑,无需依赖真实数据库,可手动模拟UserRepository对象:
import { Test, TestingModule } from '@nestjs/testing'; import { UsersController } from '../../../../src/modules/users/users.controller'; import { UsersService } from '../../../../src/modules/users/users.service'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from '../../../../src/entities/users.entity'; describe('UserController', () => { let controller: UsersController; let mockUserRepo: Partial<Repository<User>>; beforeEach(async () => { // 模拟仓库核心方法,根据测试需求扩展其他方法 mockUserRepo = { save: jest.fn().mockResolvedValue({ id: 1, username: 'test', email: 'test@example.com', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }), }; const module: TestingModule = await Test.createTestingModule({ controllers: [UsersController], providers: [ UsersService, // 用getRepositoryToken获取正确的注入标识,绑定模拟仓库 { provide: getRepositoryToken(User), useValue: mockUserRepo, }, ], }).compile(); controller = module.get<UsersController>(UsersController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); // 示例:测试用户注册接口逻辑 it('should return success response when registering user', async () => { const createUserDto = { username: 'test', email: 'test@example.com', password: '123456', }; const response = await controller.registerUser(createUserDto); expect(response.code).toBe(200); expect(response.message).toBe('User successfully created !'); expect(mockUserRepo.save).toHaveBeenCalledTimes(1); }); });
额外注意
如果UsersService还依赖其他服务(如ConfigService、TokenGuard相关服务),需要在测试模块中同样提供或模拟这些依赖,避免出现新的依赖解析错误。
内容的提问来源于stack exchange,提问作者Codder
相关产品推荐
相关产品推荐

