[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Зависимости объектов
MenOne
Привет!

Возмем такой код:

class Magic
{
public function magic()
{
$object = new Object();
//...
}
}

Теперь нам надо написать unit тест на класс Magic при этом нужно заменить класс Object свои тестовым объектом.

Внимание вопрос: Как лучше можно переписать код, что бы во время тестирования можно было легко заменить объект? Я имею ввиду ServiceLocator и прочее. Что вы используете?
SlavaFr
Вариант 1
Передать Object как параметр к примеру Set-методом или конструктором. Для удобства можно использовать dependency injection container или просто фабрику которая делает инициализацию.

Вариант 2 (менее хорош)
Фабрика с статическим методом которая создает объект, но которая в состоянии его заменять.
Типа

class FactoryObject
{
protected static $mockObject=null;

public static function setMockObject(Object $mock)
{
self::$mockObject = $mock;
}

public static function disableMock()
{
self::$mockObject = null;
}

public function getInstance()
{
return self::$mockObject?self::$mockObject : new Object();
}
}



Таким образом ты сможеш вызывать FactoryObject::getInstance(); в классе, но при желании заменить объект ты можеш перед вызовом метода magic заменить объект посредством FactoryObject::setMockObject($object); или отменить посредством FactoryObject::disableMock();

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
MenOne
Спасибо за ответ!

В данный момент тружусь над старым проектом, где new может вызываться много раз в методе. Тут наверно стоит посмотреть в сторону dependency injection container... ServiceLocator для мелких классов не используется?
SlavaFr
В принципе понятно, что если в методе используется оператор new с твердым названием класса, то произвести замену объекта именно в этом участке уже не получится. Избавится от оператора new конечно не как нелъзя, но если создание самого объекта проишодит в преднозначенных для этого местах, типа factory или dependency injection container которые занимаются только инициализацией, то мы по крайней мере оставляем все участки самого класса заменяемыми, что позволяет многократное использование самого класса a также позволяет инекцию Mock-объектов при их тестирование.





_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.