所以我试图创建一个简单的超时 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/