【问题标题】:mock typeorm findAndCount option's nested querybuilder模拟 typeorm findAndCount 选项的嵌套查询构建器
【发布时间】:2022-06-28 23:13:26
【问题描述】:

如您所知,typeorm 查找选项,特别是 findAndCount,有一个 where 选项,它采用查询构建器,您可以在 docs 中看到。使用它的查询构建器创建自定义查询真的很容易,但是对其进行测试和模拟,这是我不知道该怎么做的事情。所以这就是我使用它的方式:

const options: FindManyOptions<UserEntity> = {
      join: {
        alias: 'User',
        innerJoinAndSelect: {
          userLogin: 'User.userLogin',
          payment: 'User.payment',
        },
      },
      where: (queryBuilder: SelectQueryBuilder<UserEntity>) => {
        queryBuilder.andWhere(`${queryBuilder.alias}.isManual = 1`);
        if (!filters) {
          return;
        }
        if (filters.id) {
          queryBuilder.andWhere(`${queryBuilder.alias}.id = :id`, { id: filters.id });
        }
        if (filters.userId) {
          queryBuilder.andWhere(`${queryBuilder.alias}.userId = :userId`, { userId: filters.userId });
        }
      },
      skip: paginationDto.skip,
      take: paginationDto.size,
    };

      options.order = { createdAt: 'DESC' };
    const [users, total] = await this._transactionOnlineRepository.findAndCount(options);

这就是我试图模拟它的方式:

    Const fakeQueryBuilder= {
join: jest.fn().mockReturnThis(),
where: (p)=> p.whereFactory(<SelectQueryBuilder<UserEntity>>{
 andWhere: jest.fn().mockReturnThis();
})}
const fakeUserRepo = {
findAndCount : jest.fn(()=>fakeQueryBuilder)
};

你知道如何模拟这个或如何检查我的过滤器是否被应用?

【问题讨论】:

    标签: typescript unit-testing jestjs nestjs typeorm


    【解决方案1】:
    const returnMock = 'test';
    const subQueryMock = {
            select: jest.fn().mockReturnThis(),
            from: jest.fn().mockReturnThis(),
            where: jest.fn().mockReturnThis(),
            subQuery: jest.fn().mockReturnThis(),
            getQuery: jest.fn().mockReturnValue(returnMock)
          };
    
      const createQueryBuilderMock = {
        select: jest.fn().mockReturnThis(),
        addSelect: jest.fn().mockReturnThis(),
        innerJoin: jest.fn().mockReturnThis(),
        innerJoinAndMapOne: jest.fn().mockReturnThis(),
        where: jest.fn().mockReturnThis(),
        andWhere: jest.fn(function (cb) {
          if (typeof cb === 'function') {
            cb(subQueryMock);
          }
          return this;
        }),
        setParameters: jest.fn().mockReturnThis(),
        cache: jest.fn().mockReturnThis(),
        insert: jest.fn().mockReturnThis(),
        values: jest.fn().mockReturnThis(),
        orIgnore: jest.fn().mockReturnThis(),
        offset: jest.fn().mockReturnThis(),
        limit: jest.fn().mockReturnThis(),
        orderBy: jest.fn().mockReturnThis(),
        getMany: jest.fn().mockReturnValue(returnMock),
        getManyAndCount: jest.fn().mockReturnValue(returnMock),
        execute: jest.fn().mockReturnValue(returnMock)
      };
    

    我遇到了类似的问题,我需要模拟 subQuery,我已经这样解决了。注意 mockReturnThis 会重写你的实例

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2021-01-22
      • 2016-04-02
      • 1970-01-01
      • 2019-10-06
      • 2019-06-09
      相关资源
      最近更新 更多