Новое в Symfony 6.2: Компонент Clock
14529

Новое в Symfony 6.2: Компонент Clock


Тестирование функций, связанных со временем, затруднено и приводит к появлению ошибок в тестах. Именно поэтому в Symfony 2.8, более шести лет назад, мы ввели для тестов мокинг Clock. В Symfony 6.2 мы расширяем эти усилия, представив новый компонент под названием Clock.

Этот новый компонент улучшит тестируемость вашего кода, чувствительного ко времени. Группа PHP-FIG работает над аналогичным предложением в PSR-20, поэтому мы разработали компонент Symfony Clock для облегчения совместимости с ним.

Этот компонент определяет следующий интерфейс ClockInterface:

namespace Symfony\Component\Clock;

interface ClockInterface
{
    // returns the current datetime (it's designed to be compatible with PSR-20)
    public function now(): \DateTimeImmutable;

    // advances the clock by the provided number of seconds
    public function sleep(float|int $seconds): void;

    // changes the time zone returned by now()
    public function withTimeZone(\DateTimeZone|string $timezone): static;
}

В дополнение к интерфейсу, компонент предоставляет три конкретные реализации:

  • NativeClock, использует системные часы, поэтому возвращает реальное текущее время, засекает реальное количество заданных секунд и т.д.;
  • MockClock, подходит для тестов, всегда возвращает одно и то же время (переданное в конструктор) и переводит время мгновенно, без обращения к реальной функции PHP sleep();
  • MonotonicClock, подходит для профилирования производительности, он использует монотонные часы, предоставляемые PHP через функцию hrtime(), и спит реальное количество заданных секунд.

В связи с этим, в Symfony 6.2 мы также улучшили существующий класс ClockMock компонента PHPUnit Bridge. Кристиан Флотманн добавил поддержку имитации функции hrtime().