2011-02-23 17 views
5

He estado buscando una respuesta a este problema durante horas en Google y en otros sitios sin suerte. He creado algunas pruebas de unidad para mi proyecto de Zend Framework usando PHPUnit. Todo va bien con las pruebas hasta el momento del informe de Cobertura del Código PHPUnit. En este punto me sale el siguiente error:PHPUnit - Informe de Cobertura del Código Generador de Problemas con la aplicación 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

Este error hace referencia al siguiente bloque de código:

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

Este código es de una biblioteca que no he escrito de manera que probablemente añade complejidad a mi problema porque es menos probable que entienda lo que está pasando. Tampoco sé qué está haciendo la lógica de PHPUnit cuando crea el informe de cobertura del código, por lo que no sé cómo solucionar el problema. Este problema solo ocurre cuando ejecuto PHPUnit y he ejecutado xdebug para rastrear el código en esta función bajo condiciones normales de operación. Tengo la sensación de que PHPUnit entra en una condición donde la variable es nula pero en el funcionamiento normal $ stack y $ categoryRequest no son nulos.

Mi estructura de directorios es la siguiente:

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 es el siguiente:

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

Respuesta

2

Después de hablar con @derickr en twitter, utilicé xdebug.auto_trace = 1 en mi PHP INI para rastrear el problema. El problema estaba en esta línea de código:

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

Esto se encuentra en la función anterior denominada getStack(). El auto_trace mostró que la primera vez que se ejecuta getStack(), se ejecuta correctamente. El motivo por el que PHPUnit estaba causando la aparición del error es que cuando ejecuta el informe de Cobertura del código, el despachador se ejecuta varias veces, ingresando de nuevo getStack() y activando la línea de código antes mencionada. El código necesario el siguiente cambio para eliminar el error y localizar correctamente el plug-in en la memoria:

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

El informe de cobertura de código genera ahora correctamente. Esperemos que esto ayude a explicar el problema a otros que se encuentran con errores similares.

-Ross

-3

correctamente la prueba de PHPUnit no es correcto .

+0

Descubrí el problema en un complemento, lea a continuación para la solución. – rossdh

Cuestiones relacionadas