在 JS 中测试异步函数 - 错误:“您是否忘记使用等待”

lan*_*ilz 6 async-await typescript es6-promise jestjs

我的代码如下所示:

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是由于 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);
  }
Run Code Online (Sandbox Code Playgroud)

结果将我的 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,如果我的容器类(getResponseFromURL() 的返回类型)在我测试此异步函数时是状态和正文的容器,那么之前expect.getResponseFromURL().getStatus().toBe(200)会起作用。

测试如下所示:

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

现在我收到错误.getStatus(),我不知道如何绕过这个错误?

“不存在于 Promise”

Bri*_*ams 5

在上面的代码中await,调用了调用的getStatus结果ContainerGlobals.getResponseFromURL()

ContainerGlobals.getResponseFromURL()返回 aPromise并立即调用getStatus()给出Promise错误,因为getStatus“不存在于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
});
Run Code Online (Sandbox Code Playgroud)

await...但是为了便于阅读,您可能希望将该行分成两行:

test('Async function', async () => {
  expect.assertions(1);
  const result = await ContainerGlobals.getResponseFromURL();  // let the Promise resolve
  const data = result.getStatus();  // call getStatus on the result
  expect(data).toBe(207);  // SUCCESS
});
Run Code Online (Sandbox Code Playgroud)