BACK
Use casesMarble test typeahead — проверяем debounce/switchMap
Use cases · 65

Marble test typeahead — проверяем debounce/switchMap

Паттерн

Typeahead зависит от ВРЕМЕНИ (debounce) и от ОТМЕНЫ (switchMap). Тестировать через setTimeout с реальными таймерами — медленно и flaky на CI. Marble-тесты дают virtual time: 100мс проходят мгновенно, но stream «думает» что прошло 100мс.

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

Если тест ждёт 300мс реальных — на загруженном CI он может застрять или дать flaky-результат. А вы хотите тестировать ИДЕЮ алгоритма (отменили старый запрос, обработали последний), а не реальное время.

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

  • TestScheduler — даёт virtual time. debounce, timer, interval работают в этой шкале мгновенно.
  • Marble-string входа ('-a-ab--abc') — описывает события на timeline.
  • Expected marble — описывает ожидаемый результат, включая когда именно он должен прийти.

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

  • Real timers в тестах debounce — рецепт flaky тестов. Локально проходит, на CI падает.
  • Mock HTTP должен быть cold observable, чтобы switchMap-cancellation действительно проверялся.
  • Marbles проверяют не только значения, но и ВРЕМЯ эмиссий. Если у вас тест «получил abc» — это не покрывает «отменил a и ab».

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

Время typeahead становится детерминированным тестовым контрактом. Тесты быстрые и стабильные.

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