Use cases/Marble 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 становится детерминированным тестовым контрактом. Тесты быстрые и стабильные.