在JS中测试异步功能-错误:“您忘了使用await吗?”

时间:2019-01-04 17:07:55

标签: typescript async-await jestjs es6-promise

我的代码如下:

public getUrl(url) {
//returns URL
 ... }

public getResponseFromURL(): container {
  let myStatus = 4;
  const abc = http.get(url, (respon) => 
  const { statusCode } = respon;
  myStatus = statusCode;
  console.log('Inside callback' +myStatus);
  .on('error', (err) => {
  console.log('Things have gone wrong' + err);
  });
  console.log('ITS COMPLICATED' +myStatus);
  return new Container(status, body, header);
  }
}

我面临的问题是由于JS和console.log('ITS COMPLICATED')的异步特性,因此它在回调函数中先执行。我正在尝试在最后一个console.log之前执行第一个!

我正在使用Async / Await,如下所示:

  public timeoutPromise(time: any) {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve(Date.now());
      }, time);
    });
  }

  public doSomethingAsync() {
    return this.timeoutPromise(1000);
  }

结果将我的getResponseFromURL()更改为:

public async getResponseFromURL(): Promise<container> {
    this.myStatus = 7;
    console.log(0);
    await this.doSomethingAsync();
    console.log(1);
    const abc = http.get(url, (respon) => {
      const { statusCode } = respon;
      this.myStatus = statusCode;
      console.log('Inside Callback ' + statusCode);
    }).on('error', (err) => {
      console.log('Things have gone wrong ' + err);
    });
    await this.doSomethingAsync();
    console.log(2);
    await this.doSomethingAsync();
    console.log('Is it simple lalala ' + this.myStatus);
    await this.doSomethingAsync();
   }
}

这样做的问题是,当我在expect.getResponseFromURL().getStatus().toBe(200)可以正常工作之前测试此异步函数时,如果我的容器类(返回类型getResponseFromURL())是状态和主体的容器。

测试如下所示:

  test('Async function', async () => {
    expect.assertions(1);
    const data = await ContainerGlobals.getResponseFromURL().getStatus();
    expect(data).toBe(207);
  });

现在我从.getStatus()中收到错误消息,我不确定如何绕过此错误?

  

“在Promise上不存在”

1 个答案:

答案 0 :(得分:1)

在上面的代码中,await的调用结果是getStatus的调用结果。

ContainerGlobals.getResponseFromURL()返回一个ContainerGlobals.getResponseFromURL()并立即在Promise上调用getStatus()给出了一个错误,因为PromisegetStatus上不存在”

Promise需要在await返回的Promise上调用,而ContainerGlobals.getResponseFromURL()应该在getStatus返回的结果上调用。

解决此问题的最快方法是在await上加上括号:

await

...但是您可能希望将test('Async function', async () => { expect.assertions(1); const data = (await ContainerGlobals.getResponseFromURL()).getStatus(); expect(data).toBe(207); // SUCCESS }); 行分成两行以提高可读性:

await