我正在处理一个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