jestjs - 无法模拟 createQueryBuilder 函数 typeorm Nestjs Jest

标签 jestjs nestjs typeorm ts-jest

我正在尝试为我的服务文件编写单元测试用例。有一个函数 linkDevice 连接 2 个表 user 和 device 并返回对象。我检查设备是否已分配给用户。如果已分配,我会抛出 BadRequestExcpetion,如果没有分配,我会将其添加到用户。

我尝试将mockResolvedValue添加到where函数,但它给出了以下错误

 TypeError: Cannot read property 'mockResolvedValue' of undefined

      129 |       new BadRequestException(),
      130 |     );
    > 131 |     profileRepository.createQueryBuilder.where.mockResolvedValue();
          |                                                ^
      132 |     const result = await service.linkDevice(device, 2);
      133 |     console.log(result);
      134 |     expect(service.linkDevice).toHaveBeenCalledWith(device, 2);

服务.spec.ts

 beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        ProfileService,
        {
          provide: getRepositoryToken(Profile),
          useValue: {
            create: jest.fn(),
            save: jest.fn(),
            findOne: jest.fn(),
            createQueryBuilder: jest.fn(() => ({
              where: jest.fn().mockReturnThis(),
              setParameter: jest.fn().mockReturnThis(),
              leftJoinAndSelect: jest.fn().mockReturnThis(),
              getOne: jest.fn().mockReturnThis(),
            })),
          },
        },
      ],
    }).compile();

    service = module.get<ProfileService>(ProfileService);
    profileRepository = module.get(getRepositoryToken(Profile));
  });

 it('should throw error if device is already linked to profile', async () => {
    profileRepository.createQueryBuilder.mockResolvedValue(
      new BadRequestException(),
    );
    const result = await service.linkDevice(device, 2);
    console.log(result);
    expect(service.linkDevice).toHaveBeenCalledWith(device, 2);
  });

错误

  TypeError: this.profileRepository.createQueryBuilder(...).where is not a function

      55 |     const user = await this.profileRepository
      56 |       .createQueryBuilder('profile')
    > 57 |       .where('profile.id = :id')
         |        ^
      58 |       .setParameter('id', userId)
      59 |       .leftJoinAndSelect('profile.device', 'device')
      60 |       .getOne();

      at ProfileService.linkDevice (../src/modules/profile/profile.service.ts:57:8)
      at Object.<anonymous> (profile.service.spec.ts:131:34)

最佳答案

如果您想引发错误,则应使用 mockRejectedValue 而不是 mockResolvedValue。您可能还想专门使用 mockRejectedValueOnce ,否则您将覆盖之前设置的模拟。否则你的模拟设置看起来不错。

关于jestjs - 无法模拟 createQueryBuilder 函数 typeorm Nestjs Jest ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66205061/

相关文章:

reactjs - 使用 RequireJS 依赖项测试 es6 模块时 Jest 中的 "Define is not defined"

javascript - Jest 快照 @import CSS 失败

javascript - module.exports Jest 测试中的多个函数

reactjs - 如何使用 RouteComponentProps 测试 React 组件?

node.js - 无法连接到数据库 - NEST.JS 和 TypeORM

nestjs:如何在typeorm中删除带有前缀的redis缓存

node.js - TypeORM:从订阅者中排除种子

oracle - 如何将此 oracle 查询转换为 typeorm?

nestjs - 如何从passport-google-oauth20包中获取id_token - NestJs

postgresql - 外键约束问题