🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
ClockSensitiveTrait — подмена времени в PHPUnit
Назначение
Трейт для тест-кейсов PHPUnit 10+: mockTime() ставит MockClock в глобальные часы, unmockTime() снимает подмену, а хуки #[Before]/#[After] восстанавливают исходные часы после каждого теста. Паритет с symfony ClockSensitiveTrait.
Для чего и как применять
Тесты кода на ClockHolder/DatePoint/Clock::now(): $clock = self::mockTime('2026-01-01 10:00'); $clock->sleep(60); — без ручной очистки глобального состояния.
Пример
final class InvoiceTest extends TestCase
{
use ClockSensitiveTrait;
public function testDueDate(): void
{
$clock = self::mockTime('2026-01-01 10:00');
$clock->sleep(86_400); // сутки виртуально
self::assertSame('2026-01-02', (new DatePoint())->format('Y-m-d'));
}
} // исходные часы восстановлены хуком #[After]
Анти-паттерны
В коде с внедрением зависимостей передавайте MockClock в конструктор — глобальная подмена нужна только для кода без DI.
Жизненный цикл
sequenceDiagram
participant P as PHPUnit
participant T as Test + trait
participant H as ClockHolder
P->>T: #[Before] saveClockBeforeTest()
T->>H: remember current clock
P->>T: test method
T->>H: mockTime() sets MockClock
P->>T: #[After] restoreClockAfterTest()
T->>H: reset + restore saved clock
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Подмена времени одной строкой в тесте | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Автовосстановление часов после теста | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
Возврат MockClock для управления временем | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Атрибуты PHPUnit 10+ вместо аннотаций | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Всего | 🏆 4 | 3 | 0 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano