如何在 angular 测试中等待异步方法?

How to wait on async method in an angular test?

在 angular 应用程序中,我使用了一些工具库和我的一些代码:

  1. 异步声明
  2. 在我不想等待的内部使用 setInterval。

我发现 this article 展示了如何使用 fakeAsync、flushMicrotask 和 tick,它们似乎可以完成工作,但似乎不起作用。

目前我有这个:

  it('should refresh the token in time', fakeAsync(() => {
    //Arrange
    let token = null;
    generateToken().then(result => {
      token = result;
      console.log('Generated token: ' + token); //properly displayed
    });
    flushMicrotasks();
    expect(token).not.toBeNull(); //crashes
    //Rest of the test


  }));
});

但似乎 expectgenerateToken 方法之前执行。

(generateToken returns 一个 Promise 并基本上用 jose 库生成一个测试令牌)

我可以在“it”方法中使用异步声明,但我的理解是这不会解决我的实际问题,以加速 setInterval

推荐的测试异步代码的方法有变化吗?或者我错过了什么?

只需 await 结果

it('should refresh the token in time', async () =>{
   const token = await generateToken();
   expect(token).not.toBeNull();
});

这样你可以序列化代码执行。

你试过tickflush了吗?

    let token = null;
    generateToken().then(result => {
      token = result;
      console.log('Generated token: ' + token); //properly displayed
    });
    tick(2 * 60 * 1000); // move time 2 minutes in a fake way
   
    flush();
    // can also use discardPeriodicTasks(); instead of flush
    expect(token).not.toBeNull();

刻度应该以虚假的方式将时间移动 2 分钟,flush 应该摆脱 setInterval。您不能使用 flushMicroTrasks(),因为这会刷新微任务(承诺),而不是像 setIntervalsetTimeout 这样的 Web API。 Web API 是宏任务。