2009-08-04 10 views
5

Según this lista de discusión, la forma recomendada para acceder a los recursos de la aplicación en un controlador de Zend MVC es:Ajuste del InvokeArg correcta al ejecutar controlador de Zend Framework en Zend_Test aprovechar

$this->getInvokeArg('bootstrap')->getResource('foo'); 

Esto funciona en la producción (cuando navegando a la página web correspondiente). Sin embargo, cuando pruebo una acción del controlador que contiene este código con Zend_Test_PHPUnit_ControllerTestCase, obtengo:

PHP Fatal error: Llamada a una función miembro getResource() en un objeto no ... en/application/controllers/IndexController.php on línea 12

Hasta la introducción que getInvokeArg cosa, las pruebas funcionó muy bien. La pregunta es, ¿cómo puedo hacer que la forma "recomendada" de acceder a los recursos funcione en el arnés de prueba?

acaba de comprobar: $this->getFrontController()->getParam('bootstrap')->getResource('foo') tampoco funciona.

ACTUALIZACIÓN: Me hago llamar a la rutina de carga de aplicaciones con phpunit --bootstrap ./scripts/application_bootstrap.php ... y sé que ejecuta bien.

Y no tengo:

$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini' 
); 

$application->bootstrap(); 
+0

jason, no importa lo que pruebo. Solo un "despacho" único en un caso de prueba, activando la acción del controlador bajo prueba, desencadenará el problema. Zero afirma. El controlador funciona bien en producción, pero explota en Zend_Test/PHPUnit. –

Respuesta

4

Editar: Lo siento, me perdí esa parte de su pregunta la primera vez (sin café todavía!). He editado la respuesta.

El problema radica en que Zend_Test_PHPUnit_ControllerTestCase se entiende a los controladores de unidad de prueba. Intenta usar muy pocas dependencias del resto del framework, y NO ejecuta/arranca automáticamente/lo que sea (y no conoce) su aplicación más grande.

Básicamente, getResouce no funciona, debido a su archivo de arranque no existe.

Si echas un vistazo al Zend_Test_PHPUnit_ControllerTestCase verás que se configura manualmente y usa Zend_Controller_Front, e inicializa sus propios objetos de solicitud/respuesta para cada prueba. Está intentando ser lo más posible una prueba de la unidad, no una prueba funcional o de integración.

Para resolver su problema, tiene que decirle al conjunto de pruebas cómo para iniciar su aplicación. Hay un par de formas de lograr esto.

Uno, puede asignar un archivo al público bootstrap propiedad de la clase de prueba.

public $bootstrap = '/path/to/bootstrap/file.php' 

Esta es una buena opción para las aplicaciones que usan Zend_Application.

O, proporcionando una devolución de llamada a la propiedad bootstrap:

public function setUp() 
{ 
    // Use the 'start' method of a Bootstrap object instance: 
    $bootstrap = new Bootstrap('test'); 
    $this->bootstrap = array($bootstrap, 'start'); 
    parent::setUp(); 
} 

Nota: Es muy importante llamar al método parent setUp si que lo sustituya.

Edición 2: Ok, está realidad bootstrapping su aplicación.Entonces, has hecho lo anterior, y todavía no hay suerte.

Recomendaría reemplazar el método dispatch del TestCase, para asegurarse de que está recibiendo el bootstrap. (Esto funcionará seguro).

public function dispatch($url = null) 
{ 
    $this->getFrontController()->setParam('bootstrap', $yourBootstrap); 
    parent::dispatch($url); 
} 

Ahora que lo pienso de ella, probablemente podría hacerlo en el setUp también.

Esto permitirá que el banco de pruebas imite correctamente el comportamiento de un controlador frontal construido por Zend_Application. Ambos métodos de acceso al bootstrap deberían funcionar ahora.

+0

El código de ruptura está en la subclase Zend_Controller_Action - un controlador, no en un caso de prueba –

+0

Jason, llamo a la rutina de arranque: phpunit --bootstrap ./scripts/application_bootstrap.php, y estoy seguro de que se ejecuta (por $ aplicación -> bootstrap();), ya que todos los recursos están disponibles a través de Zend_Registry, donde puse cosas en init. –

+0

Gracias por esta solución. Pasé horas pensando que era un problema con mi propio arranque de prueba. Zend_Test realmente necesita una mejor documentación, especialmente en lo que se refiere a Zend_Application. –

9

Me encontré con el mismo problema al usar un complemento de controlador que necesitaba el programa de arranque.

Básicamente creé una clase abstracta y heredé de ella.


abstract class My_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase 
{ 
    protected $application; 

    public function setUp() 
    { 


     $this->bootstrap = array($this, 'appBootstrap'); 


     return parent::setUp(); 
    } 

    public function appBootstrap() 
     { 

     $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/app.ini'); 

     $this->application->bootstrap(); 

     $bootstrap = $this->application->getBootstrap(); 

     $front = $bootstrap->getResource('FrontController'); 

     $front->setParam('bootstrap', $bootstrap); 

     } 
} 

continuación, se utiliza la siguiente manera:


class MyControllerTest extends My_ControllerTestCase 
{ 

} 

también Me he registrado una solicitud para que esta funcionalidad convertirse aparte de ZF

[ZF-7373]: (http://framework.zend.com/issues/browse/ZF-7373) -

Dejar un comentario ayudaría a resaltar esto para su inclusión.

Cuestiones relacionadas