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()允许设置正确的注入令牌。
THE END
二维码