2010-12-04 5 views
5

Je suis un fan de 100% de couverture de code, mais je n'ai aucune idée de comment tester le ErrorController dans Zend Framework.Contrôleur d'erreur UnitTest dans Zend Framework

Il n'y a aucun problème pour tester la 404Action et 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'); 
    } 

Mais comment tester une erreur d'application (500)? peut-être que j'ai besoin de quelque chose comme ça?

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

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

} 

Répondre

0

Eh bien, je ne suis pas très familier avec ce sujet, mais je voudrais manipuler ce comportement avec un plugin ErrorHandler personnalisé (étendre l'original, et prétendre qu'une exception a été levée). Peut-être qu'il est possible de l'enregistrer seulement pour un test.

1

Ceci est une vieille question, mais je luttais avec cela aujourd'hui et ne pouvais pas trouver une bonne réponse ailleurs, donc je vais aller de l'avant et poster ce que j'ai fait pour résoudre ce problème. La réponse est vraiment très simple.

Pointez votre répartition vers une action qui entraînera une exception levée.

Mon application génère une erreur lorsqu'une requête get est envoyée à un point de terminaison JSON. J'ai donc utilisé l'une d'entre elles pour la tester.

/** 
    * @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); 
    } 

Sinon, si vous ne me dérange pas d'avoir une action juste pour le test, vous pouvez simplement créer une action qui jette seulement une erreur et le point à cette action dans votre test unitaire.

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

Ensuite, votre test ressemblerait à ceci:

/** 
    * @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); 
    } 
Questions connexes