首页 > 解决方案 > 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)”直接打我不想要的代码。

请提供任何帮助。

标签: javascriptnode.jstypescriptjasmine

解决方案


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

推荐阅读