![](/img/trans.png)
[英]Typescript inheritance and promises: how to get resolved promise in the sub class
[英]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.