所以我试图创建一个简单的超时承诺
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?
});
});
答案 0 :(得分:2)
目前还不可能。为了实现这一点,需要做两件事:
由于这两个还不可能 - 目前你不可能做你想要的。我们正在研究这个问题。你必须使测试异步并且await
承诺 - 它将花费15毫秒,并且没有什么可以做的。
这是因为promises总是延迟一个microtick - 我们在Node.js中将其编码为use case testing #1。