【问题标题】:NestJS and Jest: Nest can't resolve dependencies of the UserServiceNestJS 和 Jest:Nest 无法解析 UserService 的依赖关系
【发布时间】:2022-02-02 22:10:00
【问题描述】:

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

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

Nest 无法解析 UserService (?) 的依赖关系。请确保索引 [0] 处的参数 UserRepository 在 RootTestModule 上下文中可用

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> {}

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

【问题讨论】:

    标签: jestjs nestjs mikro-orm


    【解决方案1】:

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

    那么你应该使用provide: UserRepository,因为现在你的提供者的令牌是一个类引用,而不是它的名字。

    【讨论】:

    • 感谢您的解决方案!来自 MikroORM 的人提供了更好的解释,但你的答案是第一位的,所以我接受你的。谢谢!
    【解决方案2】:

    Nest 8 改变了 DI 的工作方式,它以前使用字符串标记,但现在它改用类引用。嵌套 MikroORM 适配器确实为自定义存储库注册了字符串标记和类引用。在这里,您是自己注册存储库,因此您需要以两种方式注册它,或者至少以您使用的方式注册。

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

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

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

    【讨论】:

    • 在我问这个问题之前,我确实尝试过使用类引用而不是字符串。但由于某种原因,这似乎是错误的。谢谢你的解释!
    猜你喜欢
    • 2020-03-07
    • 2019-12-19
    • 2018-11-22
    • 2019-12-19
    • 2018-12-25
    • 2020-01-16
    • 2020-01-14
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多