jestjs - 什么是 nestjs typeorm 中的 getRepositoryToken 以及何时使用它?
问题描述
这里的文档如下:
在对应用程序进行单元测试时,我们通常希望避免建立数据库连接,保持我们的测试套件独立并尽可能快地执行它们。但是我们的类可能依赖于从连接实例中提取的存储库。我们如何处理?解决方案是创建模拟存储库。为了实现这一点,我们设置了自定义提供程序。每个注册的存储库都由一个存储库令牌自动表示,其中 EntityName 是您的实体类的名称。
@nestjs/typeorm 包公开了 getRepositoryToken() 函数,该函数根据给定实体返回准备好的令牌。
那有什么意思?自动完成文档只是给出签名而没有解释。
解决方案
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()
允许设置正确的注入令牌。
推荐阅读
- vue.js - 在 Visual Studio 2019 中运行 vue.js Web 应用程序时生成错误
- python - 如何将数据发送到 python 文件中的 pyspark 表单?
- java - 如何对这个 doFilter() 方法进行单元测试?
- css - 如何为圆形边框添加渐变?
- java - 为什么 spring boot 会返回一些值为 null 的 json?
- sql - ORA:01821: 插入记录时无法识别日期格式
- amazon-web-services - 将已在 S3 中的文件放入文件夹中
- node.js - 每当我尝试将服务器添加到用户模型时,Sequelize 不会在直通/联结表中添加记录
- python - 编写一个函数longestWord(),它接收一个单词列表,然后返回以“ion”结尾的最长单词
- json - sed 帮助:如何仅当在另一个匹配行范围内找到时打印一系列行