繁体   English   中英

如何在带有笑话的打字稿中的类方法中获得嵌套promise的代码覆盖?

[英]How to get code coverage of nested promises in a method of a class in typescript with jest?

该类的方法的返回类型为void,并且包含对多个嵌套方法的调用,这些方法返回了promises:

export class OverviewModule implements ModuleExport {
    createTearSheetExcel = (data)=>
    {
        let overviewWorkbook = new Excel();
        let overviewWorksheet = overviewWorkbook.addWorksheet('TearSheet');

    let overviewStyleCaption = overviewWorkbook.createStyle({
        font: {
          color: '000000',
          size: 12,
          bold: true
        },
      });

      let overviewStyleNormalText = overviewWorkbook.createStyle({
        font: {
          color: '000000',
          size: 12,
        },
        alignment: {
            wrapText: true,
            vertical: 'center'
          },
      });
      /*let captionArray: string[] = ['Name', 'Domain','City','Country','Year Founded',
      'Description', 'Status', 'Total Funding', 'Revenue', 
      'Employees','Social', 'Sector/Industry','Categories','Phone', 'Contact'];*/
      let companyProfile = data.data.companyProfile || {};
      let generalProfile = data.data.generalProfile || {};
      let monetaryHeaders: string[] = [];
      let monetaryValues: string[] = [];
      if(companyProfile.type==='PUBLIC')
      {
        monetaryHeaders = ['Market Cap','Enterprise Value'];
        monetaryValues = [generalProfile.marketCap.toLocaleString('en-US', { style: 'currency', currency: generalProfile.currencyId }).slice(0,-3)
                        ,generalProfile.enterpriseValue.toLocaleString('en-US', { style: 'currency', currency: generalProfile.currencyId }).slice(0,-3)];
      }
      if(companyProfile.type==='PRIVATE')
      {
        monetaryHeaders = ['Total Funding'];
        monetaryValues = [companyProfile.totalFundingUsd.toLocaleString('en-US', { style: 'currency', currency: "USD" }).slice(0,-3)];
      }

      let headers = ['Name', 'Description','Status',monetaryHeaders,
      'Revenue', 'Employees', 'Domain', 'City', 'Country','Year Founded', 'Sector/Industry','Categories','Phone', 'Contact', 'Social'].reduce((acc: string[], val) => acc.concat(val), []);
      if(companyProfile.type==='PUBLIC')
      {
          headers.splice(1,0,"Ticker");
      }
      overviewWorkbook.addHeaders(headers,
      overviewWorksheet, overviewStyleCaption);

    let websites = data.data.websites || "";
    let socialMultiline = '';
    websites.forEach(webs => {
        if(webs.websiteType!=='homepage')
        {
            socialMultiline += webs.url + '\n';
        }
    });
    let revenueValue = generalProfile.revenueData ? generalProfile.revenueData.value.toLocaleString('en-US', { style: 'currency', currency: generalProfile.revenueData.currencyId }).slice(0,-3) : "";
    let dataArray: string[] = [companyProfile.name || "", companyProfile.description || "-",
                                (companyProfile.type.substr(0,1) || "") + (companyProfile.type.substr(1).toLowerCase() || ""),
                                monetaryValues,revenueValue,
                                (companyProfile.numEmployeesMin || "") + ' - ' + (companyProfile.numEmployeesMax.toString() || ""),
                                websites[0].url || "", data.data.headquarters[0].city, companyProfile.country || "",
                                companyProfile.foundedOn.substring(0,4) || "", companyProfile.sectorAndIndustry || "",
                                data.data.categories.map(cat=>cat.name).toString(),
                                companyProfile.phoneNumber || "", companyProfile.contactEmail || "",
                                socialMultiline
                                 ].reduce((acc: string[], val) => acc.concat(val), []);

    if(companyProfile.type==='PUBLIC')
    {
        dataArray.splice(1,0, data.data.companyProfile.tickerName);
    }                           
    for(let i=1; i<=dataArray.length;i++)
    {
        overviewWorkbook.fillCell(overviewWorksheet,2,i,dataArray[i-1],overviewStyleNormalText);//(1,i).string(captionArray[i-1]).style(styleCaption);
    }

    return overviewWorkbook.writeToBuffer();
    }

    processModule(id: string ,moduleName: string ,authToken :string, companyname: string, companyId: string, messageReceipt: string, clientId: string) {
        let filename = companyname + " Overview " + getCurrentDate() + ".xlsx";

        logger.info(`${filename} processing started`);
        Cache.add(id , jsonStringify({fileName: filename, status: Status.IN_PROGRESS}));
        logger.info(`${filename} added to cache`);

        process.send = process.send || function () {console.log("Process send is not a function")};
        process.send(Status.IN_PROGRESS);
        let cookie = formCookie(authToken, clientId);
        getModuleData(companyId , moduleName, authToken).then(data=>{
            getSectorAndIndustryData(cookie || '').then(secAndIndData => {
                data.data.companyProfile.sectorAndIndustry = data.data.companyProfile.type === 'PRIVATE' 
                ? "-" : fetchSectorAndIndustryName(secAndIndData,data.data.companyProfile.sectorCode, data.data.companyProfile.industryCode);
            getTickerName(authToken, companyId).then((tickerDetails) => {
                data.data.companyProfile.tickerName = tickerDetails.code || "";
                    this.createTearSheetExcel(data).then(buffer => {
                        logger.info(`${filename} is being saved to S3`);
                        S3.upload(APP_BUCKET_NAME,filename,buffer);
                        Cache.update(id , jsonStringify({fileName: filename, status: Status.AVAILABLE}));
                        Queue.deleteMessage(messageReceipt).catch(error =>{
                            Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                            logger.error(`${filename} error while creating excel sheet`);
                            logger.error(error);
                          });
                        logger.info(`${filename} processing complete`);
                }).catch(error =>{
                    Queue.deleteMessage(messageReceipt).catch(error =>{
                        Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                        logger.error(`${filename} error while deleting from Queue`);
                        logger.error(error);
                      });
                    Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                    logger.error(`${filename} error while creating excel sheet`);
                    logger.error(error);
                });
            }).catch(error =>{
                Queue.deleteMessage(messageReceipt).catch(error =>{
                    Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                    logger.error(`${filename} error while deleting from Queue`);
                    logger.error(error);
                  });
                Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                logger.error(`${filename} error while creating excel sheet`);
                logger.error(error);
              });
            }).catch(error =>{
                Queue.deleteMessage(messageReceipt).catch(error =>{
                    Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                    logger.error(`${filename} error while deleting from Queue`);
                    logger.error(error);
                  });
                Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                logger.error(`${filename} error while creating excel sheet`);
                logger.error(error);
              });
        })
        .catch(error =>{
            Queue.deleteMessage(messageReceipt).catch(error =>{
                Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
                logger.error(`${filename} error while deleting from Queue`);
                logger.error(error);
              });
          Cache.update(id , jsonStringify({fileName: filename, status: Status.ERROR}));
          logger.error(`${filename} error while recieving data from graphql service`);
          logger.error(error);
        });
      }



}

getModuleData之后不显示代码覆盖范围。 在getModuleData之后调用的所有方法都不会被覆盖,即使它们被调用,因为我可以在日志中看到输出。

注意;-getModuleData,getSectorAndIndustryData和getTickerName实际上对我使用nock捕获的服务进行api调用。

这实际上很难阅读。 如果您可以将promise链转换为“ await”(可能通过稍微改变一下通货膨胀并将processModule转换为async),那么它将解决您的“嵌套”并简化了玩笑。 我认为您实际上是在序列化而不是在此处嵌套承诺。我认为这是您想要的。 如果有任何可以从并行化中受益的步骤,那么您可以在某个时候等待多个promise。 无论如何,希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM