Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Tools, если нельзя, но очень хочется
SlavaFr  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1565
Пользователь №: 22453
На форуме: 7 лет, 2 месяца, 17 дней
Карма: 105




Обычно при тестирование классов рекомендуют и требуют тестировать только публичные методы и переменные.

НООООО, иногда сложная логика скрывается именно в приватных методах и переменных, которые очень важны при тестирование, но скрыты от пользователя (тема для холивара).
Для этих редких целей о для того, что бы избежать использования Reflection во время самого тестирования я создал для себя контейнер, который позволяет пользоваться приватными методами и переменными объекта, для того, что бы увидеть результаты при тестирование этих приватных методов.

Пример применения.

namespace Test {

use Tools\PrivateToPublicContainer; // мой туль

// класс с приватными методами и мемберами для тестирования

class A {
private $ding = 5;
private $dong = null;

public function getDong(){return $this->dong;}
public function getDing(){return $this->ding;}

private function setPrivateDing($ding)
{
$this->ding = $ding;
}

private function getPrivateDing()
{
return $this->ding;
}
}



//ТЕСТ
$a = new A;

//передаём объект в контейнер и получаем через контейнер возможность пользоваться приватными методами и переменными объекта $а
/** @var A $container */
$container = new \Tools\PrivateToPublicContainer($a);

$container->dong = 10;
$container->ding = 20;
echo "\n". $a->getDing() . ' ' . $a->getDong() ."\n";

$container->setPrivateDing(50);
echo $container->getPrivateDing();
}



########
Ну а код который я состряпал в PrivateToPublicContainer:

namespace Tools{

use Exception;

class PrivateToPublicContainer
{
private $reflect;
private $object;
public function __construct($object)
{
if (!is_object($object)) {
throw new Exception('Containder is only for objects.');
}
$this->object = $object;
$this->reflect = new \ReflectionObject($object);
}

public function __get($name)
{
$property = $this->validateAndSetAcessible($name);
return $property->getValue($this->object);
}

public function __set($name, $value)
{
$property = $this->validateAndSetAcessible($name);
$property->setValue($this->object, $value);
}

public function __call($name, $arguments)
{
if (!$this->reflect->hasMethod($name)) {
throw new \UnexpectedValueException('method ' . $name . ' not exists');
}

$method = $this->reflect->getMethod($name);
$method->setAccessible(true);
return $method->invokeArgs($this->object, $arguments);

}

/**
*
@param $name
*
@return \ReflectionProperty
*/

private function validateAndSetAcessible($name)
{
if (!$this->reflect->hasProperty($name)) {
throw new \UnexpectedValueException('Property ' . $name . ' is not exists.');
}
$property = $this->reflect->getProperty($name);
$property->setAccessible(true);
return $property;
}
}
}


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса