CloudCastle Clock

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

MockClock — мок-часы с виртуальным сном

Назначение

Как FrozenClock, но дополнительно реализует SleepableClockInterface: sleep() мгновенно сдвигает виртуальное время, не блокируя процесс.

Для чего и как применять

Тестирование retry/backoff, поллинга и тайм-аутов за миллисекунды: код «спит», часы сдвигаются, тест не ждёт.

Пример

$clock = MockClock::from('2026-01-01 00:00:00', 'UTC');
$retry = new RetryPolicy($clock);  // код использует sleep()
$retry->run();                      // мгновенно: сон виртуальный
$clock->sleepUntil(new DateTimeImmutable('2026-01-01 00:05:00'));

Анти-паттерны

Не смешивайте с реальными задержками (usleep) в одном сценарии — время расслоится.

Жизненный цикл

sequenceDiagram
    participant T as Test
    participant C as MockClock
    participant S as Service
    T->>C: from('2026-01-01')
    T->>S: run()
    S->>C: sleep(30)
    C-->>S: instantly (+30s virtual)
    S->>C: now()
    C-->>S: 00:00:30

Сравнение возможности с аналогами

Аспект🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Виртуальный sleep() без блокировки✅✅❌❌❌❌
sleepUntil() до момента✅❌❌❌❌❌
Сдвиги назад (rewind)✅❌❌❌❌❌
Изоляция без глобального состояния✅✅❌✅✅✅
Всего🏆 420111

← К списку возможностей


🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano