Итак, функция:
function testMe ($a, $b) { $obj = new CalculationObject(); return $obj->calcIt ($a, $b); }
как насмехаться над этим творением?
Рефакторинг функции для разделения создания объекта и использования объекта.
Если это метод класса, тривиальное решение состоит в том, чтобы сделать $obj
свойством класса, чтобы вы могли заменить его макетом.
Если вам всегда нужен новый экземпляр CalculationObject
, можно использовать шаблон фабрики.
function testMe ($a, $b) { $obj = $this->factory->getNewCalculationObject(); return $obj->calcIt ($a, $b); }
Затем замените $this->factory
на заглушку, которая возвращает ваш макет для getNewCalculationObject()
.
Если это действительно процедурная функция, а не метод, вам нужно передать зависимость от функции:
function testMe ($a, $b, $factory) { $obj = $factory->getNewCalculationObject(); return $obj->calcIt ($a, $b); }
Вы можете использовать обычную фабрику по умолчанию, чтобы сделать ее обратно совместимой с вашей текущей реализацией:
function testMe ($a, $b, $factory = null) { if ($factory === null) { $factory = new CalculationObjectFactory(); } $obj = $factory->getNewCalculationObject(); return $obj->calcIt ($a, $b); }
Если это выглядит немного неуклюжим для вас, подумайте о перемещении функции в класс.