node.js - 模拟 Typeorm QueryBuilder

标签 node.js testing jestjs mocking typeorm

我需要测试这样的调用:

    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.

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

谢谢大家

最佳答案

这是我找到的解决方案:

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);

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

关于node.js - 模拟 Typeorm QueryBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67160124/

相关文章:

javascript - 如何访问和更改 keystone.js 登录页面?

reactjs - React Native 测试错误 - 无法在卸载的组件上找到节点

javascript - 如何 Jest 模拟命名导入?

node.js - 我正在使用 express js、mongoose 和 ember js。有没有办法只写一次模型?

javascript - 如何在 Winstonjs 记录器中记录未处理的超时错误?

unit-testing - Grails:使用 Spock 时如何设置默认语言环境?

javascript - 如何在 React 组件的渲染函数中测试函数和变量?

javascript - 无法从 "date-fns"模拟 startOfToday

node.js - 为什么我不能使用导入语法从 TypeScript 导入 CoffeeScript 文件

javascript - 使用值加载额外的 CONFIG 文件