5 Stimmen

PHPUnit - Problem bei der Erstellung eines Code Coverage Berichts mit einer Zend Framework Anwendung

Ich habe stundenlang in Google und auf verschiedenen anderen Websites nach einer Antwort auf dieses Problem gesucht - ohne Erfolg. Ich habe einige Unit-Tests für mein Zend Framework-Projekt mit PHPUnit erstellt. Alles geht gut mit den Tests bis zu dem Punkt der PHPUnit Code Coverage Bericht. An diesem Punkt erhalte ich den folgenden Fehler:

Generierung des Codeabdeckungsberichts, dies kann einen Moment dauern. Fataler Fehler: Aufruf zu einer Memberfunktion pushStack() auf einem Nicht-Objekt in C:\htdocs\ZendFWTutorials\ZendStorefront\library\SF\Plugin\Action.php in Zeile 32

Dieser Fehler bezieht sich auf den folgenden Codeblock:

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;
 }

Dieser Code stammt aus einer Bibliothek, die ich nicht geschrieben habe, was mein Problem wahrscheinlich noch komplizierter macht, weil ich nicht so leicht verstehe, was da vor sich geht. Ich weiß auch nicht, was die PHPUnit-Logik macht, wenn sie den Codeabdeckungsbericht erstellt, also weiß ich nicht, wie ich das Problem beheben kann. Das Problem tritt nur auf, wenn ich PHPUnit ausführe und ich habe xdebug ausgeführt, um den Code in dieser Funktion unter normalen Betriebsbedingungen zu verfolgen. Ich habe das Gefühl, dass PHPUnit eine Bedingung eingibt, bei der die Variable null ist, aber im normalen Betrieb sind $stack und $categoryRequest nicht null.

Meine Verzeichnisstruktur ist wie folgt:

Anmeldung
----->bootstrap
----->config
----->Layouts
----->Module
-------->Schaufenster
-------------->controllers
-------------->forms
-------------->models
-------------->services
-------------->ansichten
bauen
Daten
Bibliothek
----->SF
----->Zend
Öffentlich
----->css
----->Bilder
Tests
----->Bewerbung
------------->modules
------------->controllers
------------->Modelle
----TestHelper.php
----phpunit.xml

phpunit.xml sieht folgendermaßen aus:

./anwendung/

<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();

2voto

rossdh Punkte 71

Nach einem Gespräch mit @derickr auf Twitter habe ich xdebug.auto_trace=1 in meiner PHP INI verwendet, um das Problem zu finden. Das Problem lag in dieser Code-Zeile:

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

Dies ist in der oben genannten Funktion getStack() zu finden. Der auto_trace zeigte, dass getStack() beim ersten Mal korrekt ausgeführt wird. Der Grund dafür, dass PHPUnit den Fehler angezeigt hat, ist, dass der Dispatcher beim Ausführen des Code Coverage-Berichts mehrfach ausgeführt wird, wodurch getStack() erneut aufgerufen und die oben genannte Codezeile ausgelöst wird. Der Code musste wie folgt geändert werden, um den Fehler zu beheben und das Plug-in im Speicher richtig zu lokalisieren:

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

Der Bericht über die Codeabdeckung wird jetzt korrekt erstellt. Ich hoffe, dass dies das Problem für andere erklärt, die mit ähnlichen Fehlern konfrontiert werden.

-Ross

-3voto

powtac Punkte 39079

Ihr PHPUnit-Test ist nicht korrekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X