NestJS 和 Jest:Nest 无法解析 UserService 的依赖关系

NestJS and Jest: Nest can't resolve dependencies of the UserService

我正在使用 NestJS + MikroORM 堆栈并尝试使用 Jest 编写测试。

user.service.spec.ts 上,我总是收到以下错误:

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

user.service.spec.ts:

describe('UserService', () => {
  let userService: UserService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        UserService,
        {
          provide: getRepositoryToken(User),
          useValue: {
            find: jest.fn().mockResolvedValue([]),
            findOneOrFail: jest.fn().mockResolvedValue({}),
            create: jest.fn().mockReturnValue({}),
            save: jest.fn(),
            update: jest.fn().mockResolvedValue(true),
            delete: jest.fn().mockResolvedValue(true),
          },
        },
      ],
    }).compile();

    userService = module.get<UserService>(UserService);
  });

  it('should be defined with dependencies', () => {
    expect(userService).toBeDefined();
  });
});

user.repository.ts:

@Repository(User)
export class UserRepository extends EntityRepository<User> {}

为什么会这样?根据所有其他教程,它应该可以工作。谢谢。

如果您的 UserService 的构造函数有
private readonly repo: UserRepository

那么你应该使用 provide: UserRepository 因为现在你的提供商的令牌是 class 引用,而不是它的名称。

Nest 8 改变了 DI 的工作方式,它以前使用字符串标记,但现在它使用 class 引用代替。嵌套 MikroORM 适配器确实为自定义存储库注册了字符串标记和 class 引用。这里是您自己注册存储库,所以您要么需要两种方式都注册它,要么至少按照您使用的方式进行注册。

通过类型导入需要class引用方式。通过 @InjectRepository() 导入需要字符串标记。 forFeature() 调用注册它们,以防实体有自定义存储库 class。

https://github.com/mikro-orm/nestjs/blob/e51206762f9eb3e96bfc9edbb6abbf7ae8bc08a8/src/mikro-orm.providers.ts#L82-L94

因此,要么按照其他答案中的建议添加 provide: UserRepository,要么使用 @InjectRepository() 装饰器。