【问题标题】:Mock Typeorm QueryBuilder模拟 Typeorm QueryBuilder
【发布时间】:2021-04-19 10:19:26
【问题描述】:

我需要像这样测试一个调用:

    const queryBuilder = getConnection('default')
        .createQueryBuilder(Reading, 'r')
        .where("r.code = :code AND um = 'KWH'", { code: meter.code })
        .andWhere(" measure_date BETWEEN to_date(:startDate,'YYYY-MM-DD') AND to_date(:endDate,'YYYY-MM-DD')", {
            startDate,
            endDate,
        })
        .andWhere('r.deleted_at IS NULL')
        .orderBy('r.measure_date', 'DESC')
        .addOrderBy('r.reading_type')
        .addOrderBy('r.band', 'ASC');

    const readings = await queryBuilder.getMany();

我的测试:

    const fakeSelectQueryBuilder = createStubInstance(typeorm.SelectQueryBuilder);
    fakeSelectQueryBuilder.where.returnsThis();
    fakeSelectQueryBuilder.andWhere.returnsThis();
    fakeSelectQueryBuilder.addOrderBy.returnsThis();
    fakeSelectQueryBuilder.orderBy.returnsThis();
    fakeSelectQueryBuilder.getMany.resolves([]);

    const fakeConnection = createStubInstance(typeorm.Connection);
    fakeConnection.createQueryBuilder.resolves(fakeSelectQueryBuilder);

但我收到:

ConnectionNotFoundError: Connection "default" was not found.

我尝试了很多解决方案,但都没有奏效。 有什么建议吗?

谢谢大家

【问题讨论】:

  • getConnection函数从何而来?请附上代码
  • 这是一个typeorm函数,用于在多个连接之间进行选择typeorm.io/#/connection/working-with-connection-1
  • 您使用的是jestjs 还是sinonjs?嘲讽?
  • 我正在使用 sinon,我还用一些(错误的)测试更新了我的问题
  • 您使用 sinon 作为 stub 库并使用 jestjs 作为您的测试运行器?

标签: node.js testing jestjs mocking typeorm


【解决方案1】:

这里是我找到的解决方案:

const fakeSelectQueryBuilder = sandbox.createStubInstance(typeorm.SelectQueryBuilder);
fakeSelectQueryBuilder.where.returnsThis();
fakeSelectQueryBuilder.andWhere.returnsThis();
fakeSelectQueryBuilder.addOrderBy.returnsThis();
fakeSelectQueryBuilder.orderBy.returnsThis();
fakeSelectQueryBuilder.getMany.resolves([{ plp: 666 }]);

const fakeSelectQueryBuilder2 = sandbox.createStubInstance(typeorm.SelectQueryBuilder);
fakeSelectQueryBuilder2.where.returnsThis();
fakeSelectQueryBuilder2.andWhere.returnsThis();
fakeSelectQueryBuilder2.addOrderBy.returnsThis();
fakeSelectQueryBuilder2.orderBy.returnsThis();
fakeSelectQueryBuilder2.getMany.resolves([{ plp: 999 }]);

const connection = sandbox.createStubInstance(typeorm.Connection);
connection.createQueryBuilder.onFirstCall().callsFake((p): any => {
    return fakeSelectQueryBuilder as any;
});
connection.createQueryBuilder.onSecondCall().callsFake((p): any => {
    return fakeSelectQueryBuilder2 as any;
});

sandbox.stub(typeorm, 'createConnections').resolves(([connection] as unknown) as typeorm.Connection[]);
sandbox.stub(typeorm, 'getConnection').returns(connection as any);

请注意,我的应用程序中有多个连接,因此我在测试代码中对 typeorm.createConnections 函数和多个 buildingManager 进行了存根处理,因此我使用 onFirstCallonSecondCall.

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2021-07-31
    相关资源
    最近更新 更多