CloudCastle Clock

🇷🇺 Русский · 🇬🇧 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

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

Аспект🏆 CloudCastlesymfonycarbonlcobuccibesteergebnis
Подмена времени одной строкой в тесте✅✅❌❌❌❌
Автовосстановление часов после теста✅✅❌❌❌❌
Возврат MockClock для управления временем✅✅❌❌❌❌
Атрибуты PHPUnit 10+ вместо аннотаций✅❌❌❌❌❌
Всего🏆 430000

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


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