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

无法执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:22