V4Fire/Core

Тестовый модуль для перехвата управления таймерами асинка

Opened this issue · 1 comments

Небольшой драфт, не является финальным, является небольшим изложением мыслей. Нужно дотюнить и данный подход расширить до всех таймеров и реализовать TBD

Есть так же sinonjs для моков таймеров, но на первый взгляд он не показался удобным, так как он мокает все таймауты и нельзя как-то замокать конкретно один.

Нужно изучить тему моков таймеров в рантайме и решить стоит ли использовать какую-то либо типа sinon или реализовать свой перехватчик основываясь на идентификаторы асинка

Драфт моков асинк

Async

Перехват управления над любимым таймаутом который создан через асинк

  • Не указан контекст - используется перехватчик на прототипе асинка
  • строки матчатся жестко через ===, а регулярки через match
const resolver = await Component.async.interceptTimeout({group: new RegExp(), label: ''}, {once: true});
  • Передан контекст - используется перехватчик на контексте
const component = bAdvComponentObject(...)
const resolver = await Component.async.interceptTimeout(component, {group: new RegExp(), label: ''}, {once: true});
  • Разрешить таймаут можно один раз
const component = bAdvComponentObject(...)
const interceptor = await Component.async.interceptTimeout(component, {group: new RegExp(), label: ''}, {once: true});
await interceptor.next();
  • Перехват управления над всем таймаутами подходящими по параметрами
const interceptor = await Component.async.interceptTimeout({group: new RegExp(), label: ''});
await interceptor.next(); // зарезолвится когда будет перехвачен таймаут

// резолвит все таймауты которые были созданы
for (const timeout of interceptor) {
  await interceptor.next();
}

Мок любого таймаута который создан через асинк

Мок подменяет аргументы у подходящих таймеров

  • Создание мока таймаута:
const destructor = await Component.async.mockTimeout({group: new RegExp(), label: ''}, newHandler, newTime);
  • Удаление мока через десктруктор
const destructor = await Component.async.mockTimeout({group: new RegExp(), label: ''});
await destructor();

Сбросов моков

Сбрасывает все моки, а все застрявшие либо выполняет либо отменяет

await Component.async.restoreTimeout({group: new RegExp(), label: ''}, executeOrCancel);

Эквивалент this.async.clearTimeout

await Component.async.clearTimeout()

Интеграция с componentObject

const componentObject = ...;

componentObject.async.interceptTimeout({group: new RegExp(), label: ''}) // устанавливает перехватчика на асинк компонента

Учитывая, что у Асинка единый подход к обработке всего, то нужно задизайнить универсальный АПИ :)

И правильнее завести этот issue в v4/core