javascript - Nodejs Jasmine:模拟 Promise 函数以免碰到真正的代码是给 DEFAULT_TIMEOUT_INTERVAL
问题描述
我有一个下面的函数,它返回一个承诺。
public async getAverageHeadCount(queryParams: Params, childNode: any, careerTrackId: string):
Promise<Metric> {
const queryId = this.hierarchyServiceApiUrl + "rolling-forecast/ahc/" +
queryParams.ou + "|" + ELCCommonUtil.getChildNode(childNode.id) + "/" + queryParams.gu + "/" + careerTrackId
+ "/" + queryParams.contractFlag + "/" + queryParams.year + "?id=" + ELCCommonUtil.constructForecastId(childNode);
const userKey = queryParams.userKey;
console.log("getAverageHeadCount-childNode>>>>>>>>>>>>" + JSON.stringify(childNode));
const averageHCOptions = {
headers: {
Accept: "application/json",
userKey
},
json: true,
uri: queryId
};
console.log("getAverageHeadCount-averageHCOptions>>>>>>>>>>>>" + averageHCOptions);
// tslint:disable-next-line:no-string-literal
const averageHC = await this.request(averageHCOptions);
// tslint:disable-next-line:max-line-length
console.log("averageHeadCount DATA RETUREDED >>>>>>>>>>>>>>>>>>>>>" + JSON.stringify(averageHC.data.avgHeadcount));
return averageHC.data.avgHeadcount;
// return baseBonusJSON;
}
这个方法是从服务中调用的,我已经在模拟我试图返回上述函数的模拟响应,如下所示。
fit("Should call getAverageHeadCount to construct right URI", (done) => {
const uri1 = "53860936/91/510N/FY18?id=18|51549564|F-D-test.user.sixteen-prd_us_no";
const uri = "https://wwvtn2k42h.execute-api.us-east-1.amazonaws.com/sandbox/rolling-forecast/ahc/" + uri1;
service = new EstimatedLaborCostsService(((opts) => {
expect(opts.uri).toBe(uri);
return avgHeadCount;
}));
console.log("service", service);
console.log("getAverageHeadCount is getting called");
const resultant = service.getAverageHeadCount(queryString, "53860936", "510").then((result) => {
expect(result).toEqual(avgHeadCount.data);
done();
});
});
我收到以下错误:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL
我在想的是“ const resultant = service.getAverageHeadCount(queryString, "53860936", "510").then((result)
”直接打我不想要的代码。
请提供任何帮助。
解决方案
Promise的一个棘手方面,尤其是在单元测试中,是.then(...)
回调中抛出的任何错误都会导致 Promise 被拒绝。断言抛出错误,所以如果expect(result).toEqual(avgHeadCount.data);
失败,done()
回调将不会被调用,并且你的断言失败被吞没。
done
您可以使用从测试返回 Promise 会导致测试异步的事实,而不是使用回调。如果返回的 Promise 被拒绝,则测试失败。或者只是做你的测试async
(它做同样的事情)
fit("Should call getAverageHeadCount to construct right URI", async () => {
const uri1 = "53860936/91/510N/FY18?id=18|51549564|F-D-test.user.sixteen-prd_us_no";
const uri = "https://wwvtn2k42h.execute-api.us-east-1.amazonaws.com/sandbox/rolling-forecast/ahc/" + uri1;
service = new EstimatedLaborCostsService(((opts) => {
expect(opts.uri).toBe(uri);
return avgHeadCount;
}));
console.log("service", service);
console.log("getAverageHeadCount is getting called");
const result = await service.getAverageHeadCount(queryString, "53860936", "510");
expect(result).toEqual(avgHeadCount.data);
});
推荐阅读
- arrays - 尝试遍历数组范围内的单元格时,VBA 获得“需要对象”
- python - 从 finally 子句抛出异常
- javascript - 使用 AFrame 和 ARJs 我想在标记上增强图像。当我单击或触摸(桌面和移动)图像时,它应该导航到一个 URL
- cypress - 如何在一个会话中测试两个网站
- c# - 我可以为 IEnumerable.Any 方法动态添加参数到 LINQ 查询吗?
- kubernetes - 带有 GKE 内部负载均衡器的 DNS
- python - 如何在 GUI 线程之外使用 QProgressBar.setValue。重绘错误
- .net-4.0 - 安装 GreenPipes 1.0.9 时出现错误
- node.js - Nodejs ldapjs activedirectory - 在不知道当前密码的情况下重置密码
- python - 气流触发 Dag 并等待响应状态