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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Паттерны, DI и UnitTesting

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: как отрефакторить код
Panoptik
Отправлено: 10 Сентября, 2014 - 15:20:22
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




Всем привет.
Занялся тестированием одного проекта. И столкнулся с задачкой моккирования объекта, который шлет курл запросы. Но архитектура этого не очень позволяет.
В лучшем случае я добился того что явно объявляю мок-класс с тем же именем и в результате использую именно свой класс вместо того который должен вызываться автолоадом

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

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


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


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


в нормальном коде я просто вызываю
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. ну и хотелось бы услышать советы как такое дело тестируется на самом деле и что я делаю не так


-----
Just do it
 
 Top
Bio man
Отправлено: 21 Ноября, 2014 - 01:45:38
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Насколько я знаю, много где DI заложен в основах архитектуры. И как следует из определения, DI позволяет создавать объект на основе какого то типа. DI тут очень даже уместен.
Или же через поставщика услуг (service locator) можно получить нужный объект, что даже проще в реализации.

К примеру в yii2, DI и service locator решают все проблемы с созданием объектов, в том числе и в тестах.
(Добавление)
Ой какая старая тема, сразу и не посмотрел
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB