PHPUnit - Проблема генерации отчета о покрытии кода с помощью приложения Zend Framework - PullRequest
5 голосов
/ 23 февраля 2011

Я часами искал ответ на эту проблему в Google и на других сайтах, но безуспешно.Я создал несколько модульных тестов для своего проекта Zend Framework, используя PHPUnit.Все идет хорошо с тестами вплоть до момента отчета о покрытии кода PHPUnit.В этот момент я получаю следующую ошибку:

Создание отчета о покрытии кода, это может занять некоторое время.Неустранимая ошибка: вызов функции-члена pushStack () для необъекта в C: \ htdocs \ ZendFWTutorials \ ZendStorefront \ library \ SF \ Plugin \ Action.php в строке 32

Эта ошибка ссылается наследующий блок кода:

public function
dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
{
     $stack = $this->getStack();

     // category menu
     $categoryRequest = new Zend_Controller_Request_Simple();
     $categoryRequest->setControllerName('category')
                     ->setActionName('index')
                     ->setParam('responseSegment', 'categoryMain');


     // push requests into the stack
     $stack->pushStack($categoryRequest);
 }

 public function getStack()
 {
     if (null === $this->_stack) {
         $front = Zend_Controller_Front::getInstance();
         if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack'))
         {
             $stack = new Zend_Controller_Plugin_ActionStack();
             $front->registerPlugin($stack);
         } else {
             $stack = $front->getPlugin('ActionStack');
         }
         $this->_stack = $stack;

     }
     return $this->_stack;
 }

Этот код взят из библиотеки, которую я не писал, так что, вероятно, это усложнит мою проблему, потому что у меня меньше шансов понять, что происходит.Я также не знаю, что делает логика PHPUnit при создании отчета о покрытии кода, поэтому я не знаю, как устранить проблему.Эта проблема возникает, только когда я запускаю PHPUnit и запускаю xdebug для отслеживания кода в этой функции при нормальных условиях работы.У меня такое ощущение, что PHPUnit входит в условие, когда переменная имеет значение null, но в обычной работе $ stack и $ categoryRequest не равны null.

Моя структура каталогов выглядит следующим образом:

application-----> самозагрузки-----> конфигурации-----> макеты-----> модули--------> витрина--------------> Контроллеры--------------> формы--------------> модели--------------> Услуги--------------> просмотрыстроитьданныебиблиотека-----> SF-----> Zendобщественного-----> CSS-----> Изображениятесты-----> Приложение-------------> модули-------------> Контроллеры-------------> модели---- TestHelper.php---- phpunit.xml

phpunit.xml выглядит следующим образом:

./application/

<filter>
    <whitelist>
        <directory suffix=".php">../application/</directory>
        <exclude>
            <directory suffix=".phtml">../application/</directory>
            <directory suffix=".php">../library/</directory>
        </exclude>
    </whitelist>
</filter>

<logging>
    <log type="coverage-html" target="./log/report" charset="UTF-8"
    yui="true" highlight="true" lowUpperBound="50"

highLowerBound = "80" />

TestHelper.php:

<?php // set our app paths and
 environments define('BASE_PATH',
 realpath(dirname(__FILE__) . '/../'));
 define('APPLICATION_PATH', BASE_PATH .
 '/application'); define('TEST_PATH',
 BASE_PATH . '/tests');
 define('APPLICATION_ENV', 'testing');

 //include path set_include_path('.' .
 PATH_SEPARATOR . BASE_PATH .
 '/library'  . PATH_SEPARATOR .
 get_include_path());

 // set the default timezone
 date_default_timezone_set('America/Argentina/Buenos_Aires');

 require_once 'Zend/Application.php';
 $application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/store.ini');

 $application->bootstrap();

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Поговорив с @derickr в твиттере, я использовал xdebug.auto_trace = 1 в своем PHP INI для отслеживания проблемы. Проблема была в этой строке кода:

$stack = $front->getPlugin('ActionStack');

Это находится в функции выше с именем getStack (). Функция auto_trace показала, что при первом запуске getStack () работает правильно. Причина, по которой PHPUnit вызывал появление ошибки, заключается в том, что при запуске отчета о покрытии кода диспетчер запускается несколько раз, таким образом снова вводя getStack () и вызывая вышеупомянутую строку кода. В код необходимо внести следующие изменения, чтобы устранить ошибку и правильно найти плагин в памяти:

$stack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');

Отчет о покрытии кода теперь генерируется правильно. Надеемся, что это поможет объяснить проблему для тех, кто сталкивается с подобными ошибками.

-Ross

0 голосов
/ 23 февраля 2011

Правильно, ваш тест PHPUnit неверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...