Модульное тестирование рекурсивной асинхронной функции с помощью jest

#typescript #recursion #async-await #jestjs

Вопрос:

У меня есть следующая функция, которую я ожидаю запустить в цикле:

 export const startApiCallRecursive = (fn: () =gt; Promiselt;voidgt;) =gt; {  function timer() {  setTimeout(async () =gt; {  console.log("tick");   await fn()  .then(() =gt; timer())  .catch((error) =gt; console.log(error));  }, 1000);  }  timer(); };  

когда я передаю функцию, такую как:

 const wait = (ms: number): Promiselt;voidgt; =gt;  new Promise((resolve) =gt; setTimeout(resolve, ms));  

такие как:

 startApiCallRecursive(() =gt; wait(2000))  

он работает так, как ожидалось, и регистрирует «галочку» каждые 3 секунды.

Как бы то ни было, когда я использую следующий тест:

 it("calls an async function which resolves after intervall has finished", () =gt; {  jest.useFakeTimers();  const functionToBeCalled = jest.fn().mockImplementation(() =gt; wait(100));  startApiCallRecursive(functionToBeCalled);  jest.advanceTimersByTime(5500);  expect(functionToBeCalled).toBeCalledTimes(5);  });  

это не удается …