【问题标题】:Jest :TypeError: (intermediate value) is not iterable开玩笑:TypeError:(中间值)不可迭代
【发布时间】:2022-02-11 12:53:21
【问题描述】:

我有以下两种方法。

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);
    });

它正在失败。

我什至不知道它的原因。你能帮我理解一下吗?

【问题讨论】:

    标签: javascript node.js unit-testing jestjs nestjs


    【解决方案1】:

    您的getManyAndCount 模拟应该返回一个解析值,并且是mockResolvedValueOnce,以便它可以是awaited。它还应该返回一个值数组,因为您将数组解构为两部分,certificatestotal

    【讨论】:

    • 谢谢杰。你能帮我一个班轮代码吗?我开玩笑说很新。无法解决。
    • 不确定我的评论中有什么不清楚的地方。 getManyAndCount 需要是 jest.fn().mockResolveValueOnce([[certificate], 1]) 或类似的东西。至少,根据你的代码
    • 非常感谢杰。我现在明白了。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多