NestJS中如何在E2E测试中正确使用InjectRepository
解决NestJS E2E测试中仓库实例获取失败的问题
出现这个错误的核心原因是:你在业务代码中通过@InjectRepository(MyRepo, 'dataSource')注入仓库时,指定了第二个参数(数据源的名称/标识符),而在E2E测试中直接用moduleRef.get<MyRepo>(MyRepo)获取时,没有匹配到这个带特定数据源的仓库实例,导致拿到的实例未正确初始化数据源关联,调用find()时触发getRepository undefined的错误。
具体解决方案
方案1:获取实例时指定数据源上下文
修改测试中获取仓库的代码,在get方法的第二个参数里传入数据源的上下文信息:
myRepo = moduleRef.get<MyRepo>(MyRepo, { context: 'dataSource' });
方案2:使用仓库的专属Token获取
通过getRepositoryToken工具函数生成对应数据源的仓库Token,再用这个Token获取实例:
import { getRepositoryToken } from '@nestjs/typeorm'; // 在测试代码中 myRepo = moduleRef.get<MyRepo>(getRepositoryToken(MyRepo, 'dataSource'));
额外注意事项
确保你的E2E测试模块已经正确注册了对应数据源和仓库:
const moduleFixture = await Test.createTestingModule({ imports: [ // 注册指定名称的数据源 TypeOrmModule.forRoot({ name: 'dataSource', type: 'mysql', // 替换为你的数据库类型 host: 'localhost', port: 3306, username: 'test', password: 'test', database: 'test_db', entities: [MyEntity], synchronize: true, }), // 关联数据源注册仓库 TypeOrmModule.forFeature([MyRepo], 'dataSource'), ], }).compile();
只有测试模块中正确导入了带指定数据源的TypeOrmModule.forFeature,才能保证moduleRef能获取到正确初始化的仓库实例。
内容的提问来源于stack exchange,提问作者simple_programmer
相关产品推荐
相关产品推荐

