🇷🇺 Русский · 🇬🇧 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
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
Виртуальный sleep() без блокировки | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
sleepUntil() до момента | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Сдвиги назад (rewind) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Изоляция без глобального состояния | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Всего | 🏆 4 | 2 | 0 | 1 | 1 | 1 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano