nestjstypeorm中的getRepositoryToken是什么以及何时使用它?

这里的文档如下:

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

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

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

回答

getRepositoryToken()是一个辅助方法,它允许您获取@InjectReposiotry()返回的相同注入令牌。这在测试时很有用,这样您就可以定义一个自定义提供程序,该提供程序具有用于 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()允许设置正确的注入令牌。


以上是nestjstypeorm中的getRepositoryToken是什么以及何时使用它?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>