微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jest - 在 jest.setTimeout.Error 指定的 5000 毫秒超时内未调用异步回调

如何解决Jest - 在 jest.setTimeout.Error 指定的 5000 毫秒超时内未调用异步回调

我可以看到在 SO 上有很多关于此的问题,但没有一个能回答我的问题。

我有以下测试

 it('will poll until there are no subscribers',() => {
    const polls: string[] = [];
    const complete = new Subject<void>();
    const observableSub = service
      .getPollData()
      .pipe(takeuntil(complete))
      .subscribe((value) => {
        polls.push(value);
        if (polls.length === 3) {
          console.log('here ' + JSON.stringify(polls));
          observableSub.unsubscribe();
          complete.next();
          complete.complete();
        }
      });

    return complete.toPromise().then(() => {
      console.log(service.isPolling);
      expect(service.isPolling).toEqual(false);
    });
  });

当测试运行时,我的两个控制台日志都存在并且具有正确的预期值。这一切都发生在 20 毫秒内,我的轮询频率设置为仅 5 毫秒进行测试。

我查看了我能找到的所有 SO 帖子,尝试使用 asyncasync(done) => done()fakeAsync,但似乎没有任何效果。我总是收到以下错误

超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。错误:超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。

注意:我正在为响应注入一个 MockInterceptor 并且该服务正在使用 RxJs timer() observable 进行轮询,我可以确认它在测试结束时已关闭并取消订阅,这由 expect(service.isPolling)代码确认。我曾尝试使用 jest.userRealTimersjest.usefaketimers,以防这是问题的一部分,但我的控制台日志显示预期值这一事实让我认为这不是问题。

任何帮助将不胜感激。

*按照@Estus Flask 的建议更新我现在已经将代码更新为:

it('will poll until there are no subscribers',async () => {
      const polls: any[] = [];
      const observableSub = service.getPollData().pipe(
      take(3),tap((value) => {
        polls.push(value);
      })
    );
      await observableSub.toPromise().then(() => {
      console.log(JSON.stringify(polls));
      console.log(service.isPolling);
      expect(service.isPolling).toEqual(false);
    });
 });

但仍然出现同样的错误,感觉我在做/错过一些简单而愚蠢的事情?!?!?注意:控制台输出仍然全部正确。

解决方法

如果其他人遇到此问题,值得查看测试集中的其他测试。

结果对我来说,上面的测试通过得很好,但是带有 setTimeout 的后续测试失败了。这让 Jest 感到困惑,然后将通过的测试标记为失败!

我在这方面浪费了很多时间,所以希望这对未来的人有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。