如何模拟不同的值为相同的功能笑话?



我有一个函数,我把一个时间范围作为输入,并从我的db获取2行。我需要得到给定范围内第一个和最后一个数据项之间字段的差异。

函数

async getUsage(start: Date, id: number) {
const initial = await this.datarepo
.createQueryBuilder('data')
.where('data.deviceId = :id and data.RTC > :start')
.setParameter('id', id)
.setParameter('start', start)
.orderBy('data.RTC', 'ASC')
.getOne();
const final = await this.datarepo
.createQueryBuilder('data')
.where('data.deviceId = :id and data.RTC > :start')
.setParameter('id', id)
.setParameter('start', start)
.orderBy('data.RTC', 'DESC')
.getOne();
if (!final) return 0;
const usage = final.reading- initial.reading;
return usage;
}

当我尝试模拟函数时,即使我使用mockResolvedValueOnce()

,我也会为每次调用获得相同的数据
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
DataService,
{
provide: getRepositoryToken(dataentity),
useValue: {
create: jest.fn(),
save: jest.fn(),
},
},
],
}).compile();
service = module.get<DataService>(DataService);
datarepo= module.get(getRepositoryToken(dataentity));
});
it('gives the difference between energy readings for the given time range', async () => {
datarepo.createQueryBuilder = jest.fn(() => ({
where: jest.fn().mockReturnThis(),
setParameter: jest.fn().mockReturnThis(),
orderBy: jest.fn().mockReturnThis(),
getOne: jest
.fn()
.mockResolvedValueOnce(usageStart)
.mockResolvedValueOnce(usageEnd),
}));
const result = await service.getUsage(new Date('2021-03-01T11:57:00.000Z'), 981);
expect(result).toEqual(5);
});
const usageStart = {
reading: 70,
RTC: '2021-03-01T11:57:45.000Z',
};
const usageEnd = {
reading: 75,
RTC: '2021-03-01T12:57:45.000Z',
};

我应该得到5作为结果但我得到0

expect(received).toEqual(expected) // deep equality
Expected: 5
Received: 0

您将datarepo.createQueryBuilder模拟为一个函数,该函数将返回一个对象,其中一些模拟函数包括getOne函数。

你调用this.datarepo.createQueryBuilder两次,它将返回2个不同的对象实例。然后,getOne函数总是返回第一个模拟值—usageStart,因为它永远不会再被调用。

让我们创建一个模拟对象,然后mockdatarepo.createQueryBuilder将返回该对象:

const queryBuilderMock = {
where: jest.fn().mockReturnThis(),
setParameter: jest.fn().mockReturnThis(),
orderBy: jest.fn().mockReturnThis(),
getOne: jest
.fn()
.mockResolvedValueOnce(usageStart)
.mockResolvedValueOnce(usageEnd),
}

datarepo.createQueryBuilder = jest.fn(() => queryBuilderMock);

如你所见,datarepo.createQueryBuilder总是返回queryBuilderMock对象。

最新更新