asynchronous - 如何在 Jest 中让 promise 超时?

标签 asynchronous promise async-await timeout jestjs

所以我试图创建一个简单的超时 promise

const delay = (time, value) => {
  return Promise.resolve(); //  THIS WORKS

  // NEED TO, but wont work
  return new Promise(function(resolve) {
    setTimeout(() => resolve(value), time);
  });
};


const request = (count) => {
  if (count === 15) return;
  return makeRequest().then(
    res => Promise.resolve() // if it works it works.
  ).catch(
    err => delay(1000).then(() => request(count - 1));
  )
}

describe("on fail", () => {
  beforeEach(() => jest.useFakeTimers());
  it("should retry 15 times", async () => {

    request();
    jest.runTimersToTime(15001); // alias `advanceTimersByTime`
    await expect(request.mock.calls.length).toBe(15); // what am i missing? or rather, what's jest missing?
  });
});

最佳答案

目前这是不可能的。为了实现这一点,需要发生两件事:

  • 来自 Jest 方面 - 他们需要完成 migrating to lolex这是一个持续的努力,将他们的假计时器与Sinon的统一起来
  • 从 Node.js 方面 - 我们需要 implement hooks让您可以自己运行 Promise 微任务队列。这确实是上周 Node.js 核心和 V8 团队之间的一次 session 的新成果。

由于这两个尚不可能 - 目前不可能执行您所要求的操作。不过我们正在努力解决这个问题。您必须使测试异步并等待 promise - 这将需要 15 毫秒,而且对此无能为力。

这是因为 Promise 总是会延迟一个 microtick - 我们在 Node.js 中将其编码为 use case testing #1 .

关于asynchronous - 如何在 Jest 中让 promise 超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50783013/

相关文章:

javascript - 在 setTimeout 中使用异步有效吗?

javascript - 尝试使用 Mongoose 和异步保存到数据库时出现多个错误

c# - ObservableCollection 项的异步更新

jsf - 如何在@Asynchronous 方法中正确使用CDI?

javascript - 用 Promise 处理循环

javascript - 在 JavaScript/AngularJS 中返回相同的返回值中的两个不同的东西

for 循环中来自 LocalForage 的 JavaScript 链式 promise

c# - 是否可以更改异步方法的任务创建选项?

ecmascript-6 - 使用 await 调用 Stripe API

multithreading - QueueUtil 为 MessageHandler 生成太多线程,异步/等待问题