无法执行NestJS E2E测试:依赖注入解析失败求助
解决NestJS测试中DataSource依赖无法解析的问题
错误原因
你遇到的错误核心在于:ParametrageRepository通过@InjectDataSource()注入了全局DataSource,但E2E测试模块仅导入了ParametrageModule,未初始化TypeOrm根模块——也就是没有提供全局可用的DataSource实例,导致TypeOrmModule上下文找不到所需的依赖项。
可行解决方案
方案1:用内存数据库初始化TypeOrm根模块
在测试模块中导入TypeOrmModule.forRoot(),配置轻量的内存数据库(比如SQLite),为测试环境提供完整的TypeOrm上下文:
describe("ParametrageController (e2e)", () => { let parametrage: INestApplication; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [ TypeOrmModule.forRoot({ type: 'sqlite', database: ':memory:', entities: [Parametrage], synchronize: true, dropSchema: true, }), ParametrageModule, ], }).compile(); parametrage = moduleFixture.createNestApplication(); await parametrage.init(); }); it("/ (POST)", () => request(parametrage.getHttpServer()) .post("/parametrage") .send({ libelle: "GROUPE_TYPE", liste: ["TEAM", "SERVICE", "ORGANISATION"], }) .expect(201)); });
方案2:Mock DataSource依赖
如果不想依赖真实数据库,可以手动MockDataSource并注入到测试模块,完全模拟数据库交互:
describe("ParametrageController (e2e)", () => { let parametrage: INestApplication; // 模拟DataSource和所需的Repository方法 const mockDataSource = { getRepository: jest.fn().mockReturnValue({ save: jest.fn().mockResolvedValue({ id: 1, libelle: "GROUPE_TYPE", liste: ["TEAM", "SERVICE", "ORGANISATION"], }) }) }; beforeEach(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ imports: [ParametrageModule], providers: [ { provide: DataSource, useValue: mockDataSource }, { provide: Logger, useValue: { log: jest.fn() } }, ], }).compile(); parametrage = moduleFixture.createNestApplication(); await parametrage.init(); }); it("/ (POST)", () => request(parametrage.getHttpServer()) .post("/parametrage") .send({ libelle: "GROUPE_TYPE", liste: ["TEAM", "SERVICE", "ORGANISATION"], }) .expect(201)); });
纠正你之前的错误尝试
你之前用useValue: ParametrageRepository是无效的——useValue需要传入类的实例而非类本身。而且问题的核心是缺少DataSource的注入,优先解决这个依赖才是关键。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

