Search code examples
node.jstestingjestjsmockingtypeorm

Mock Typeorm QueryBuilder


I need to test a call like this:

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

my test:

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

but i receive:

ConnectionNotFoundError: Connection "default" was not found.

i tried many solutions, but none worked. any suggestions?

thx to all


Solution

  • Here the solution I 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);
    

    note that I have mulitple connections in my app so I stubbed the typeorm.createConnections function and multiple buildingManager in tested code so I use onFirstCall and onSecondCall.