Функциональность макета / заглушки PHPUnit в классе - PullRequest
0 голосов
/ 10 ноября 2011

Мне нужен совет, как мне решить эту проблему.

Использование PHP Примером может быть:

class BuilderClass {
 function getClass($id, $some, $vars){
  $dbResult = new db_Class::getDbRows($id, $some, $vars);
  foreach(...)
   // Build something from the database values

  return self;
 }
}

Итак, я хочу создать контрольный пример, в котором я каким-нибудь образом высмеиваю результаты БД.

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

Я мог бы что-то изменить в самом сборщике, например, вызвать класс, который выполняет функцию: FunctionRunner :: runStaticFunction ("db_Class", "getDbRows", $ args, $ something_else); Но сейчас я не знаю, возможно ли это тоже. Любые исследовательские статьи, которые охватывают этот или любые сайты, которые объясняют это. Я бы оценил что-нибудь в данный момент.

Спасибо / Marcus

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Разделение операций извлечения данных из базы данных и построения данных.

class BuilderClass {
    function getClass($id, $some, $vars){
        $dbResult = new db_Class::getDbRows($id, $some, $vars);
        return doGetClass($dbResult);
    }

    function doGetClass($dbResult) {
        foreach(...)
         // Build something from the database values

        return self;   
    }
}

Таким образом, вы можете проверить doGetClass в отрыве от вызова базы данных.

1 голос
/ 10 ноября 2011

Как часто бывает, неспособность легко написать тесты для ваших функций вызвана недостатком в дизайне вашего приложения. В этом случае db_Class тесно связан с вашим BuilderClass.

Правильным решением было бы иметь объект Database в вашем BuilderClass, используя внедрение зависимостей, и насмехаться над этим внедрением, чтобы вернуть статический результат.

class BuilderClass
{
    protected $oDatabase;
    public function __construct(db_Class $oDatabase) {
        $this->oDatabase = $oDataabse;
    }

    public function getClass($someVars) {
        $this->oDatabase->getDbRows($someVars);
    }
}

Таким образом, объект базы данных легко заменяется заглушкой.

0 голосов
/ 10 ноября 2011

Есть много способов сделать это, но так как мы говорим на PHP, вы можете использовать функцию magic class loader .

Проще говоря, если вы хотите смоделировать слой доступа к данным, вы просто создаете объект с фактическим именем класса данных, и автозагрузчик никогда не вызывается.

Хотите получить доступ к базе данных? не определяйте класс, и автозагрузчик будет вызываться при попытке доступа к базе данных, которая должна знать, что делать для загрузки класса.

В основном мои автозагрузчики, когда я их использую, имеют тенденцию выглядеть примерно так;

function __autoload($className)
{
  if(file_exists('../includes/'.$className.'.php'))
    require_once('../includes/'.$className.'.php');
}
...