[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Tools
SlavaFr
Обычно при тестирование классов рекомендуют и требуют тестировать только публичные методы и переменные.

НООООО, иногда сложная логика скрывается именно в приватных методах и переменных, которые очень важны при тестирование, но скрыты от пользователя (тема для холивара).
Для этих редких целей о для того, что бы избежать использования 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();
Быстрый ответ:

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