【问题标题】:Jest + Nestjs + Nestjsx Crud | Cannot set property findOne of [object Object] which has only a getterJest + Nestjs + Nestjsx Crud |无法设置只有 getter 的 [object Object] 的属性 findOne
【发布时间】:2020-09-26 02:50:12
【问题描述】:

我将 Nestjs 与 Nestjsx-Crud 库一起使用。服务类扩展了 TypeOrmCrudService。我需要扩展 TypeOrmCrudService 示例的服务。任何人都有任何链接或知道如何在下面修复此错误?

目前这是我的代码:

//jobService.spec

beforeAll(async () => {
    jobsModule = await Test.createTestingModule({
      providers: [
        JobsService,
        { provide: getRepositoryToken(Job), useClass: JobsMockRepository },
        // dependencies

        JobTypesService,
        { provide: getRepositoryToken(JobType), useClass: JobTypesMockRepository },
      ],
    }).compile();

    jobsService = jobsModule.get<JobsService>(JobsService);
    jobsRepositoryMock = jobsModule.get(getRepositoryToken(Job));
    jobTypesService = jobsModule.get<JobTypesService>(JobTypesService);
  });

  describe('acceptJob', () => {
    it(`should return ${notFoundMessage('JobType')}`, async () => {
      const job = Mocks.getJob();
      jest.spyOn(jobTypesService, 'findOne').mockImplementation(() => undefined);
      expect(
        await jobsService.acceptJob(job.id, { serviceProviderId: faker.random.uuid() }),
      ).toThrow(notFoundMessage('JobType'));
    });
// mockRepository

export class MockRepository<T> {
  public createQueryBuilder = jest.fn(() => this.queryBuilder);
  public manager = { transaction: (a) => Promise.resolve(a()) };
  public metadata = { connection: { options: { type: null } }, columns: [], relations: [] };
  public save = jest.fn();
  public delete = jest.fn();
  public update = jest.fn();
  public findOne = jest.fn();
  public findOneOrFail = jest.fn();
  public find = jest.fn();
  public getMany = jest.fn();
  public queryBuilder = {
    offset: jest.fn().mockReturnThis(),
    take: jest.fn().mockReturnThis(),
    orderBy: jest.fn().mockReturnThis(),
    skip: jest.fn().mockReturnThis(),
    limit: jest.fn().mockReturnThis(),
    from: jest.fn().mockReturnThis(),
    addFrom: jest.fn().mockReturnThis(),
    where: jest.fn().mockReturnThis(),
    andWhere: jest.fn().mockReturnThis(),
    innerJoinAndSelect: jest.fn().mockReturnThis(),
    leftJoinAndSelect: jest.fn().mockReturnThis(),
    getManyAndCount: jest.fn(),
    getMany: jest.fn(),
    getOne: jest.fn(),
    delete: jest.fn().mockReturnThis(),
    execute: jest.fn().mockReturnThis(),
  };
}

export class JobsMockRepository extends MockRepository<Job> {}
export class JobTypesMockRepository extends MockRepository<JobType> {}
-----------------
 TypeError: Cannot set property findOne of [object Object] which has only a getter
| 
|       77 |     it(`should return ${notFoundMessage('JobType')}`, async () => {
|       78 |       const job = Mocks.getJob();
|     > 79 |       jest.spyOn(jobTypesService, 'findOne').mockImplementation(() => undefined);
|          |            ^
|       80 |       expect(
|       81 |         await jobsService.acceptJob(job.id, { serviceProviderId: faker.random.uuid() }),
|       82 |       ).toThrow(notFoundMessage('JobType'));
| 
|       at ModuleMockerClass.spyOn (../node_modules/jest-mock/build/index.js:800:26)
|       at Object.<anonymous> (modules/jobs/jobs.service.spec.ts:79:9)

谁能帮帮我?


解决方案:

代替模拟扩展 TypeOrmCrud 的服务方法,模拟存储库类方法:

jest.spyOn(jobTypesRepositoryMock, 'findOne').mockResolvedValue(
                () => undefined);

感谢@michalk93

----------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------


【问题讨论】:

    标签: unit-testing jestjs crud nestjs


    【解决方案1】:

    因为 findOne 方法是 TypeScript 定义中的 readonly 属性,所以不能使用 jest.spyOn 甚至 Object.assign 重新分配它。如果你想模拟 findOne 方法,你可以查看 TypeOrmCrudService 的 TypeScript 定义,你会看到那一行

    readonly findOne: Repository<T>['findOne'];
    

    这意味着您可以模拟的不是 Service findOne 方法,而是存储库 findOne 方法来达到相同的结果。

    所以解决方案已经在您的存储库模拟中。您可以设置findOne 方法的定义,如下所示,从findOne 返回undefined,就像您现在在测试中一样:

    public findOne = jest.fn().mockReturnValue(undefined);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2021-05-31
      • 2020-08-29
      • 2019-04-09
      • 2019-02-24
      • 2020-09-16
      相关资源
      最近更新 更多