首页 > 解决方案 > 什么是 nestjs typeorm 中的 getRepositoryToken 以及何时使用它?

问题描述

这里的文档如下:

在对应用程序进行单元测试时,我们通常希望避免建立数据库连接,保持我们的测试套件独立并尽可能快地执行它们。但是我们的类可能依赖于从连接实例中提取的存储库。我们如何处理?解决方案是创建模拟存储库。为了实现这一点,我们设置了自定义提供程序。每个注册的存储库都由一个存储库令牌自动表示,其中 EntityName 是您的实体类的名称。

@nestjs/typeorm 包公开了 getRepositoryToken() 函数,该函数根据给定实体返回准备好的令牌。

那有什么意思?自动完成文档只是给出签名而没有解释。

标签: jestjsnestjstypeorm

解决方案


getRepositoryToken()是一个帮助方法,允许您获取@InjectRepository()返回的相同注入令牌。这在测试方面很有用,因此您可以定义一个自定义提供程序,该提供程序具有匹配 DI 解析的令牌,因此您可以提供Repository方法的模拟,而无需实际与数据库对话。例如,如果你有

@Injectable()
export class FooService {
  constructor(@InjectRepository(Foo) private readonly fooRepo: Repository<Foo>) {}

}

在您的测试中,您可以添加提供者

{
  provide: getRepositoryToken(Foo),
  useValue: {
    find: jest.fn(),
    insert: jest.fn(),
  },
}

现在你已经有了一个用于Repository.

必须以这种方式完成事情的最大原因是因为 typescript 不反映泛型类,它只反映Repository,并且如果 Nest 试图找出您要注入的存储库,只有那个名称 ( Repository) 它很可能会弄错并注入错误的类。使用@InjectRepsitory()允许设置正确的注入令牌。


推荐阅读