Подтвердить что ты не робот

Как изменить текущее время для функций модульного тестирования в php

Как я могу изменить текущее время (т.е. вывод time()) в PHP для класса даты-манипуляции модульного тестирования?

4b9b3361

Ответ 1

Недавно я придумал решение, которое отлично, если вы используете пространства имен PHP 5.3. Вы можете реализовать новую функцию time() внутри вашего текущего пространства имен и создать общий ресурс, в котором вы устанавливаете возвращаемое значение в своих тестах. Тогда любой неквалифицированный вызов функции time() будет использовать вашу новую функцию.

Для дальнейшего чтения я подробно описал его в своем блоге .

Ответ 2

Вы можете рассмотреть модель наследования на основе интерфейса:

interface iClock
{
    public function getTime();

}

class SystemClock implements iClock
{
    public function getTime()
    {
        return time();
    }
}

class FakeClock implements iClock
{
    private $time;

    function __construct($time)
    {
        $this->time = $time;
    }

    public function getTime()
    {
        return $this->time;
    }

    // you could have more functions to advance the time, etc.
}

Ваши собственные классы, которые должны работать с текущим временем, будут иметь параметр конструктора типа интерфейса iClock.

class YourOwnClass
{
    private $clock;

    function __construct(iClock $clock)
    {
        $this->clock = $clock;
    }

    function someFunction()
    {
        $now = $this->clock->getTime();

        // whatever
        return $now;
    }
}

Затем вы просто вводите тип часов, который вы хотели, в зависимости от того, был ли вы в unit test или нет:

$realWorldInstance = new YourOwnClass(new SystemClock());   
echo $realWorldInstance->someFunction();
$unitTestInstance = new YourOwnClass(new FakeClock(1234));
echo $unitTestInstance->someFunction();

BTW - Я часто использую этот шаблон в .NET. Он также встроен в интерфейс iClock, предоставляемый Noda Time. Я не вижу причин, почему этот шаблон не работал в PHP. Возможно, вы захотите вернуть DateTime вместо целочисленной метки времени, но приведенное выше минимальное значение, необходимое для использования шаблона.

Ответ 3

Похоже, вам нужно удалить зависимость time() от класса манипуляции с датой

Ответ 4

Я думаю, вы боретесь со своими зависимостями. Похоже, вы используете функцию time() внутри своего класса, а при модульном тестировании вы хотите убедиться, что вы контролируете вывод методов/классов, которые предоставляют вам время. Я бы сказал, создайте класс времени, который предоставит вам время и высмеивает его в ваших модульных тестах.