2011-02-23 1 views
5

Ho cercato una risposta a questo problema per ore in Google e in altri siti senza fortuna. Ho creato alcuni test unitari per il mio progetto Zend Framework usando PHPUnit. Tutto va bene con i test fino al punto del report Copertura del codice PHPUnit. A questo punto ricevo il seguente errore:PHPUnit - Problema di generazione del report di copertura del codice con l'applicazione Zend Framework

Generating code coverage report, this may take a moment. Fatal error: Call to a member function pushStack() on a non-object in C:\htdocs\ZendFWTutorials\ZendStorefront\library\SF\Plugin\Action.php on line 32

Questo errore fa riferimento al seguente blocco di codice:

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

Questo codice è da una libreria che non ho scritto in modo che probabilmente aggiunge complessità alla mia problema perché sono meno propensi a capire cosa sta succedendo. Inoltre, non so cosa stia facendo la logica PHPUnit quando crea il report sulla copertura del codice, quindi non so come risolvere il problema. Questo problema si verifica solo quando eseguo PHPUnit e ho eseguito xdebug per tracciare il codice in questa funzione in condizioni operative normali. Ho la sensazione che PHPUnit entri in una condizione in cui la variabile è nullo ma nella normale operazione $ stack e $ categoryRequest non sono nulli.

La mia struttura di directory è la seguente:

application
----->bootstrap
----->config
----->layouts
----->modules
-------->storefront
-------------->controllers
-------------->forms
-------------->models
-------------->services
-------------->views
build
data
library
----->SF
----->Zend
Public
----->css
----->images
tests
----->application
------------->modules
------------->controllers
------------->models
----TestHelper.php
----phpunit.xml

phpunit.xml è la seguente:

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

risposta

2

Dopo aver parlato con @derickr su twitter, ho utilizzato xdebug.auto_trace = 1 nel mio PHP INI per rintracciare il problema. Il problema era in questa riga di codice:

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

Questo si trova nella funzione sopra citato getStack(). L'auto_trace ha mostrato che la prima volta che viene eseguito getStack(), funziona correttamente. Il motivo per cui PHPUnit stava causando la visualizzazione dell'errore è che quando viene eseguito il report della copertura del codice, il dispatcher viene eseguito più volte inserendo nuovamente getStack() e attivando la riga di codice sopra menzionata. Il codice necessario la seguente modifica per rimuovere l'errore e individuare correttamente il plug-in in memoria:

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

Il rapporto Code Coverage ora genera correttamente. Speriamo che questo aiuti a spiegare il problema per gli altri che si trovano con errori simili.

-Ross

-3

correttamente il test PHPUnit non è corretto .

+0

Ho scoperto il problema in un plug-in, leggi sotto per la correzione. – rossdh