2010-12-04 15 views
5

Soy fanático de la cobertura del 100% del código, pero no tengo idea de cómo probar el ErrorController en Zend Framework.UnitTest Error Controller en Zend Framework

No es ningún problema para probar la 404Action y la errorAction:

public function testDispatchErrorAction() 
    { 
     $this->dispatch('/error/error'); 
     $this->assertResponseCode(200); 
     $this->assertController('error'); 
     $this->assertAction('error'); 
    } 

    public function testDispatch404() 
    { 
     $this->dispatch('/error/errorxxxxx'); 
     $this->assertResponseCode(404); 
     $this->assertController('error'); 
     $this->assertAction('error'); 
    } 

Pero cómo probar para un error de aplicación (500)? tal vez necesito algo como esto?

public function testDispatch500() 
{ 
    throw new Exception('test'); 

    $this->dispatch('/error/error'); 
    $this->assertResponseCode(500); 
    $this->assertController('error'); 
    $this->assertAction('error'); 

} 

Respuesta

0

Bueno, no estoy muy familiarizado con este tema, pero me gustaría manipular este comportamiento con un plugin ManejadorError personalizado (extender el original, y pretender que ha generado una excepción). Tal vez es posible registrarlo solo para una prueba.

1

Esta es una vieja pregunta, pero estaba luchando con esto hoy y no pude encontrar una buena respuesta en ningún otro lado, así que seguiré adelante y publicaré lo que hice para resolver este problema. La respuesta es realmente muy simple.

Dirija su envío a una acción que dará como resultado una excepción lanzada.

Mi aplicación arroja un error cuando se realiza una solicitud de obtención a un punto final JSON, así que utilicé una de ellas para probar esto.

/** 
    * @covers ErrorController::errorAction 
    */ 
    public function testErrorAction500() { 
     /** 
     * Requesting a page that doesn't exist returns the proper error message 
     */ 
     $this->dispatch('/my-json-controller/json-end-point'); 
     $body = $this->getResponse()->getBody(); 
     $this->assertResponseCode('500'); 
     $this->assertContains('Application error',$body); 
    } 

Alternativamente, si no le importa que tenga una acción sólo para las pruebas, usted podría crear una acción que sólo se emite un error y apuntan a que la acción en su unidad de prueba.

public function errorAction() { 
    throw new Exception('You should not be here'); 
} 

A continuación, la prueba se vería así:

/** 
    * @covers ErrorController::errorAction 
    */ 
    public function testErrorAction500() { 
     /** 
     * Requesting a page that doesn't exist returns the proper error message 
     */ 
     $this->dispatch('/my-error-controller/error'); 
     $body = $this->getResponse()->getBody(); 
     $this->assertResponseCode('500'); 
     $this->assertContains('Application error',$body); 
    }