You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:50:42