Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
bonkalol opened this issue Feb 29, 2024 · 1 comment

Comments

@bonkalol
Copy link
Member

bonkalol commented Feb 29, 2024

Небольшой драфт, не является финальным, является небольшим изложением мыслей. Нужно дотюнить и данный подход расширить до всех таймеров и реализовать 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: ''}) // устанавливает перехватчика на асинк компонента
@kobezzza
Copy link
Contributor

kobezzza commented Mar 5, 2024

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

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

@bonkalol bonkalol transferred this issue from V4Fire/Client Mar 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants