BACK
Use casesMarble test retry — время без настоящих timer
Use cases · 66

Marble test retry — время без настоящих timer

Паттерн

Retry с backoff может занимать 1, 2, 4 секунды между попытками. Тестировать с настоящими таймерами — это многосекундный test suite. Virtual time из TestScheduler позволяет проверить ВСЮ retry-логику мгновенно.

Какую проблему решаем

Большие jasmine timeouts замедляют test suite и не дают гарантии — на медленном CI всё равно может flakнуть. Плюс: вам нужно проверить ИМЕННО последовательность (1 → 2 → 4 секунды), а не просто «через несколько секунд получили результат».

Операторы и зачем они нужны

  • TestScheduler — заменяет реальные timers virtual frames. scheduler.flush() прокручивает виртуальное время.
  • Marble для retry фиксирует error notifications, delay-frames и moments of resubscribe.
  • Expected marble — финальный success или fallback frame.

Подводные камни

  • Нельзя надёжно тестировать backoff через setTimeout и jasmine timeout 10s. На CI рано или поздно упадёт.
  • Если scheduler «зашит» внутри функции (literal timer()), virtual time не подключится. Делайте scheduler параметром или зависимостью.
  • Проверяйте условие retry: 400 не должен ждать backoff как 500. Это разные пути в коде.

Что в итоге получаем

Retry policy проверяется быстро, точно и без настоящего ожидания. Test suite остаётся миллисекундным.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...