как перевести обещания в шутку? - PullRequest
0 голосов
/ 10 июня 2018

поэтому я пытаюсь создать простое обещание тайм-аута

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?
  });
});

1 Ответ

0 голосов
/ 10 июня 2018

В настоящее время это невозможно.Чтобы это стало возможным, должны произойти две вещи:

  • Со стороны Jest - им нужно завершить миграцию на lolex , что является постоянной попыткой объединить их фальшивые таймерыс
  • Sinon со стороны Node.js - нам нужно реализовать хуки , которые позволят вам самостоятельно запустить очередь обещаний для микрозадачи.Это действительно новая работа со встречи ядра Node.js и команды V8 на прошлой неделе.

Поскольку эти два еще не возможны - невозможно сделать то, что вы просите в данный момент.Мы работаем над этим, хотя.Вы должны сделать тест асинхронным и await обещанием - это займет 15 миллисекунд, и с этим ничего не поделаешь.

Это потому, что обещания всегда задерживают микротик - мы кодировали это в узле.js as use case test # 1 .

...