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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:43:27