代码之家  ›  专栏  ›  技术社区  ›  sev

嘲笑笑话问题:“mockImplementation”不存在

  •  0
  • sev  · 技术社区  · 2 年前

    我正在处理一个TypeScript项目,该项目使用DataLoader进行批量获取。我有一个名为getLoaders的函数,它返回一个具有不同实体类型的DataLoader实例的对象。

    import DataLoader from 'dataloader';
    import { EntityManager } from 'typeorm';
    import { Address, batchEntitiesBy } from './somewhere';
    
    export type LoadersType = ReturnType<typeof getLoaders>;
    
    export function getLoaders(em: EntityManager) {
      return {
        addressById: new DataLoader<number, Address>((ids) =>
          batchEntitiesBy<Address, 'id'>(em, Address, 'id', ids)
        ),
        // Some other similar dataloaders
      };
    }
    

    在另一个文件中,我有一个名为processAddress的函数,它将其中一个loader对象作为参数。

    export function processAddress(id: number, loaders: LoadersType): string {
      const Address = loaders.addressById.load(id);
      // Do something with Address
      return Address.name;
    }
    

    我想为processAddress编写Jest测试,在那里我可以为不同的测试用例模拟加载函数的不同实现。

    以下是我的尝试:

      jest.mock('dataloader', () => {
        return jest.fn().mockImplementation(() => {
          return {
            load: jest.fn(),
            loadMany: jest.fn(),
            // ... any other methods you want to mock
          };
        });
      });
    
    describe('processAddress', () => {
      const loadersMock = getLoaders({} as EntityManager);
    
      it('should call load with first mock', async () => {
        loadersMock.addressById.load.mockImplementation(() => Promise.resolve({ name: 'mocked value 1' }));
        
        const result = await processAddress(1, loadersMock);
        
        expect(loadersMock.addressById.load).toHaveBeenCalled();
        expect(loadersMock.addressById.load).toHaveBeenCalledWith(1);
        expect(result).toBe('mocked value 1');
      });
    
      it('should call load with second mock', async () => {
        loadersMock.addressById.load.mockImplementation(() => Promise.resolve({ name: 'mocked value 2' }));
        
        const result = await processAddress(2, loadersMock);
        
        expect(loadersMock.addressById.load).toHaveBeenCalled();
        expect(loadersMock.addressById.load).toHaveBeenCalledWith(2);
        expect(result).toBe('mocked value 2');
      });
    });
    

    在线

    loadersMock.addressById.load.mockImplementation(() => ...
    

    我得到了错误:

    Property 'mockImplementation' does not exist on type
    

    当我将其更改为

    (loadersMock.addressById.load as jest.Mock)).mockImplementation(() => ...
    

    我得到错误:

    TypeError: loadersMock.addressById.load.mockImplementation is not a function
    
    0 回复  |  直到 2 年前
    推荐文章