как изменить текущее время для функций даты модульного тестирования в php - PullRequest
16 голосов
/ 19 ноября 2010

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

Ответы [ 4 ]

5 голосов
/ 17 марта 2011

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

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

4 голосов
/ 28 февраля 2014

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

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;
    }
}

Тогда вы просто введете нужный вам тип часов в зависимости от того, проходите ли вы модульный тест или нет:

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

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

3 голосов
/ 19 ноября 2010

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

3 голосов
/ 19 ноября 2010

Звучит так, будто вам нужно удалить зависимость time() из вашего класса манипулирования датой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...