Jest :TypeError: (intermediate value) is not iterable
Jest :TypeError: (intermediate value) is not iterable
我有下面两种方法。
searchCertificates()
是私有方法,在findAll()
.
内部调用
async findAll(queryCertificateDto: QueryCertificateDto): Promise<PaginatedResult> {
const { data, meta } = await this.searchCertificates(queryCertificateDto);
return {
data,
meta,
};
}
private async searchCertificates(
queryCertificateDto: QueryCertificateDto
): Promise<PaginatedResult> {
const {
page,
take,
certificateNo,
startDate,
endDate,
} = queryCertificateDto;
const query = this.certificateRepository.createQueryBuilder('certificate');
if (certificateNo) {
query.andWhere('certificate.certificateNo=:certificateNo', { certificateNo });
}
if (startDate && endDate) {
query.andWhere('CAST(certificate.createdAt as Date) BETWEEN :startDate AND :endDate', {
startDate,
endDate,
});
} else if (startDate) {
query.andWhere('CAST(certificate.startDate as Date)=:startDate', { startDate });
} else if (endDate) {
query.andWhere('CAST(certificate.endDate as Date)=:endDate', { endDate });
}
const [certificates, total] = await query
.orderBy('certificate.certificateNo', 'ASC')
.take(take)
.skip((page - 1) * take)
.getManyAndCount();
return {
data: certificates,
meta: {
total,
page,
last_page: Math.ceil(total / take),
},
};
}
我写了下面的测试用例来覆盖 startDate
。
useValue: {
find: jest.fn().mockReturnValue(certificate),
createQueryBuilder: jest.fn(() => ({
andWhere: jest.fn().mockReturnValue(certificate),
getManyAndCount: jest.fn().mockReturnValueOnce(certificate),
orderBy: jest.fn().mockReturnThis(),
take: jest.fn().mockReturnThis(),
skip: jest.fn().mockReturnThis(),
page: jest.fn().mockReturnThis(),
})),
findOne: jest.fn().mockReturnValue(certificate),
save: jest.fn().mockReturnValue(new Certificate()),
softRemove: jest.fn().mockReturnValue(new Certificate()),
},
下面是测试用例。
it('return the Certificate list for start date', async () => {
const queryCertificateDto = new QueryCertificateDto();
queryCertificateDto.startDate = '23-MAR-2019';
const result = await service.findAll(queryCertificateDto);
expect(result['startDate']).toEqual(certificate.startDate);
});
越来越失败了。
我什至不知道这是为什么。你能帮我理解一下吗?
您的 getManyAndCount
模拟应该 return 一个已解析的值,并且 mockResolvedValueOnce
以便它可以被 await
编辑。它还应该 return 一个值数组,因为您将数组解构为两部分,certificates
和 total
我有下面两种方法。
searchCertificates()
是私有方法,在findAll()
.
async findAll(queryCertificateDto: QueryCertificateDto): Promise<PaginatedResult> {
const { data, meta } = await this.searchCertificates(queryCertificateDto);
return {
data,
meta,
};
}
private async searchCertificates(
queryCertificateDto: QueryCertificateDto
): Promise<PaginatedResult> {
const {
page,
take,
certificateNo,
startDate,
endDate,
} = queryCertificateDto;
const query = this.certificateRepository.createQueryBuilder('certificate');
if (certificateNo) {
query.andWhere('certificate.certificateNo=:certificateNo', { certificateNo });
}
if (startDate && endDate) {
query.andWhere('CAST(certificate.createdAt as Date) BETWEEN :startDate AND :endDate', {
startDate,
endDate,
});
} else if (startDate) {
query.andWhere('CAST(certificate.startDate as Date)=:startDate', { startDate });
} else if (endDate) {
query.andWhere('CAST(certificate.endDate as Date)=:endDate', { endDate });
}
const [certificates, total] = await query
.orderBy('certificate.certificateNo', 'ASC')
.take(take)
.skip((page - 1) * take)
.getManyAndCount();
return {
data: certificates,
meta: {
total,
page,
last_page: Math.ceil(total / take),
},
};
}
我写了下面的测试用例来覆盖 startDate
。
useValue: {
find: jest.fn().mockReturnValue(certificate),
createQueryBuilder: jest.fn(() => ({
andWhere: jest.fn().mockReturnValue(certificate),
getManyAndCount: jest.fn().mockReturnValueOnce(certificate),
orderBy: jest.fn().mockReturnThis(),
take: jest.fn().mockReturnThis(),
skip: jest.fn().mockReturnThis(),
page: jest.fn().mockReturnThis(),
})),
findOne: jest.fn().mockReturnValue(certificate),
save: jest.fn().mockReturnValue(new Certificate()),
softRemove: jest.fn().mockReturnValue(new Certificate()),
},
下面是测试用例。
it('return the Certificate list for start date', async () => {
const queryCertificateDto = new QueryCertificateDto();
queryCertificateDto.startDate = '23-MAR-2019';
const result = await service.findAll(queryCertificateDto);
expect(result['startDate']).toEqual(certificate.startDate);
});
越来越失败了。
我什至不知道这是为什么。你能帮我理解一下吗?
您的 getManyAndCount
模拟应该 return 一个已解析的值,并且 mockResolvedValueOnce
以便它可以被 await
编辑。它还应该 return 一个值数组,因为您将数组解构为两部分,certificates
和 total