Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Паттерны, DI и UnitTesting
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Паттерны, DI и UnitTesting

Страниц (1): [1]
 

1. Panoptik - 10 Сентября, 2014 - 15:20:22 - перейти к сообщению
Всем привет.
Занялся тестированием одного проекта. И столкнулся с задачкой моккирования объекта, который шлет курл запросы. Но архитектура этого не очень позволяет.
В лучшем случае я добился того что явно объявляю мок-класс с тем же именем и в результате использую именно свой класс вместо того который должен вызываться автолоадом

теперь приведу примерную картину кода который нужно протестировать. и собственно вопрос как лучше его протестировать или отрефакторить, чтобы его стало возможно тестировать

// базовый класс интерфейс
Спойлер (Отобразить)


// наследуемый класс интерфейс
Спойлер (Отобразить)


потомок и его реализация
Спойлер (Отобразить)


в нормальном коде я просто вызываю
PHP:
скопировать код в буфер обмена
  1.  
  2. $serviceName = 'service1'; // get from request
  3. $service = BaseService::getService($serviceName);
  4.  
  5. $service->f1(); // вызов методов интерфейсов
  6. $service->f2();
  7.  


задача стоит протестировать модульными тестами классы MyServiceN

нужно моккировать класс CurlRequest - который создается в конструкторе PrimitiveService и тем самым избежать отправки непосредственных запросов при тестах

в связи с этим у меня есть следующие мысли вопросы:
1. используется ли здесь какой либо паттерн проектирования и как он называется? подозреваю что это что-то типа фабрики
2. я думаю что здесь можно (или даже нужно) впилить DI (Dependency Injection) и в конструкторе к сервису передавать каким реквестером (объект типа CurlRequest) будет пользоваться сервис
3. ну и хотелось бы услышать советы как такое дело тестируется на самом деле и что я делаю не так
2. Bio man - 21 Ноября, 2014 - 01:45:38 - перейти к сообщению
Насколько я знаю, много где DI заложен в основах архитектуры. И как следует из определения, DI позволяет создавать объект на основе какого то типа. DI тут очень даже уместен.
Или же через поставщика услуг (service locator) можно получить нужный объект, что даже проще в реализации.

К примеру в yii2, DI и service locator решают все проблемы с созданием объектов, в том числе и в тестах.
(Добавление)
Ой какая старая тема, сразу и не посмотрел

 

Powered by ExBB FM 1.0 RC1