【问题标题】:Typeorm getRepository mockImplementation returning mocked findOne methodTypeorm getRepository mockImplementation 返回模拟的 findOne 方法
【发布时间】:2021-08-12 23:57:30
【问题描述】:

我正在使用带有 typeOrm 的 nestjs
这是我要测试的方法。

PropertyBuilder.ts

import { getRepository } from 'typeorm'
...

export class PropertyBuilder extends BasicEntityBuilder<PropertyDto, Property> {
  async onUpdatedOwner_id(entity: any, dtoField: string, propertyDto: PropertyDto) {
    if (dtoField !== 'owner_id') {
      throw new Error('dtoField is not valid')
    }
    entity[dtoField] = await getRepository(User).findOne({ id: propertyDto.owner_id })
  }
} 

PropertyBuilder.spec.ts

import ...

describe('PropertyBuilder', () => {
  let userRepository: Repository<User>

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [
        {
          provide: getRepositoryToken(User),
          useClass: Repository,
        },
      ],
    }).compile()

    userRepository = module.get(getRepositoryToken(User))
  })

  describe('onUpdatedOwner_id', () => {
    it('should set owner_id field with User object', () => {
      const expected: any = { name: 'user' }
      const entity: Property = new Property()
      const dto: PropertyDto = new PropertyDto()
      jest.spyOn(userRepository, 'findOne').mockResolvedValue(expected)
      new PropertyBuilder(Property).onUpdatedOwner_id(entity, 'owner_id', dto)
      expect(entity.owner_id).toBe(expected)
    })
  })
})

测试失败,(node:952986) UnhandledPromiseRejectionWarning: ConnectionNotFoundError: Connection "default" was not found.

我知道我不应该提供任何东西...
我试过了

describe('onUpdatedOwner_id', () => {
    it('should set owner_id field with User object', () => {
      const expected: any = { name: 'user' }
      const entity: Property = new Property()
      const dto: PropertyDto = new PropertyDto()

      const getRepositoryMock = jest.fn() as jest.MockedFunction<typeof getRepository>
      getRepositoryMock.mockImplementationOnce(() => {
        return { findOne: jest.fn().mockResolvedValueOnce(expected) }
      })

      jest.spyOn(userRepository, 'findOne').mockResolvedValue(expected)
      new PropertyBuilder(Property).onUpdatedOwner_id(entity, 'owner_id', dto)
      expect(entity.owner_id).toBe(expected)
    })
  })

但它不起作用,因为 mockImplementation 它与 getRepository 的签名不兼容

Argument of type '() => { findOne: jest.Mock<any, any>; }' is not assignable to parameter of type '(entityClass: EntityTarget<unknown>, connectionName?: string) => Repository<unknown>'.

测试我的方法的正确方法是什么?

【问题讨论】:

    标签: typescript nestjs typeorm


    【解决方案1】:

    您正在模拟 getRepositoryToken(User) 的 Nest 提供程序(在 @InjectRepository(User) 的内部使用的内容,但不是您在 PropertyBuilder 中直接使用的 TypeORM 的 getRepository 实现。模拟一个包直接开玩笑,你应该做类似的事情

    jest.mock('typeorm', () => ({
      getRepository: jest.fn().mockResolvedValue(expected)
    })
    

    最终会被提升到文件顶部并在任何 TypeORM 导入之前运行,因此可以使用它。您也可以将所需的任何其他方法添加到 ({}) 返回。

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 2022-01-23
      • 2014-02-07
      • 2022-06-16
      • 2019-03-25
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多