Я пишу тест, используя JEST.
Я не знаю, как проверить рекурсию обещаний в JEST.
В этом тесте функция повтора, которая выполняет рекурсию, является целью теста, пока не будет выполнено обещание.
export function retry <T> (fn: () => Promise <T>, limit: number = 5, interval: number = 10): Promise <T> {
return new Promise ((resolve, reject) => {
fn ()
.then (resolve)
.catch ((error) => {
setTimeout (async () => {
// Reject if the upper limit number of retries is exceeded
if (limit === 1) {
reject (error);
return;
}
// If it is less than the upper limit number of retries, execute callback processing recursively
await retry (fn, limit-1, interval);
}, interval);
});
});
}
Выполните следующий тест для вышеуказанной функции повтора.
- Всегда передавайте обещание для разрешения, и функция повтора разрешается при первом выполнении
- Передайте разрешение для разрешения при третьем запуске, а функция повтора разрешается при третьем запуске
Я думал, что при написании этих слов в JEST будет следующее.
describe ('retry', () => {
test ('resolve on the first call', async () => {
const fn = jest.fn (). mockResolvedValue ('resolve!');
await retry (fn);
expect (fn.mock.calls.length) .toBe (1);
});
test ('resolve on the third call', async () => {
const fn = jest.fn ()
.mockRejectedValueOnce (new Error ('Async error'))
.mockRejectedValueOnce (new Error ('Async error'))
.mockResolvedValue ('OK');
expect (fn.mock.calls.length) .toBe (3)
});
});
В результате произошла ошибка при следующей ошибке.
Timeout-Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Error:
> 40 | test ('resolve on the third call', async () => {
| ^
41 | const fn = jest
42 | .fn ()
43 | .mockRejectedValueOnce (new Error ('Async error'))
Я думаю, что это будет возможным при настройке JEST в отношении этой ошибки. Однако, в принципе, я не знаю, как проверить рекурсивную обработку обещаний в JEST.