Как я могу изменить текущее время (т.е. вывод time()
) в PHP для класса даты-манипуляции модульного тестирования?
Как изменить текущее время для функций модульного тестирования в php
Ответ 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() внутри своего класса, а при модульном тестировании вы хотите убедиться, что вы контролируете вывод методов/классов, которые предоставляют вам время. Я бы сказал, создайте класс времени, который предоставит вам время и высмеивает его в ваших модульных тестах.