4 votes

PHPUnit Zend Framework Controller Tests - Échec de l'affirmation du dernier contrôleur utilisé <"error"> - afficher les erreurs

Nous sommes en train de mettre en place des tests unitaires autour des contrôleurs du zend framework.

(J'ai un peu abstrait cet exemple de code, mais l'idée est la même....)

Nous avons réussi à faire échouer le test, avec le message d'erreur suivant

Failed asserting last controller used <"error"> ....

avec le test :

$this->dispatch('/controller/action/param');
$this->assertController('controller');
$this->assertAction('action');

Dans ce cas, comment faire pour que le vrai message d'erreur apparaisse à PHPUnit, c'est-à-dire que s'il y a une erreur dans le contrôleur, je veux le savoir plutôt que d'invoquer le contrôleur d'erreur.

Si je mets resources.frontController.params.noErrorHandler = 1 dans l'application.ini, le test passe même s'il y a une erreur, parce que ce contrôleur et cette action se produisent toujours, mais ne produisent rien (je sais que je pourrais chercher des assertions dans la sortie, mais ce n'est pas le but - je veux l'erreur originale).

J'ai essayé d'allumer

convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true" 

dans phpunit.xml également, sans succès.

Toute indication serait très appréciée.

J'espère que tout cela a du sens ! ?

Merci beaucoup.

5voto

Ciaran McNulty Points 10503

Malheureusement, Zend_Test_PHPUnit_ControllerTestCase surcharge explicitement certaines options du contrôleur frontal pendant la distribution. Le bout de code concerné est ici :

$controller = $this->getFrontController();
$this->frontController
     ->setRequest($request)
     ->setResponse($this->getResponse())
     ->throwExceptions(false)
     ->returnResponse(false);

Comme cela se fait à l'intérieur de dispatch(), vous n'avez absolument aucune chance de modifier les options.

Une solution que j'ai utilisée est de créer mon propre ControllerTestCase de base qui étend celui de Zend et de copier la fonction dispatch() entière de l'objet Zend, puis de changer cette ligne.

C'est sale mais ça marche. Vous pourriez faire une version plus élaborée qui lit quelque chose à partir d'une configuration, etc.

1voto

Eugene M Points 800

C'est un problème que j'ai rencontré également, et il peut être assez difficile parfois de trouver l'erreur. J'ai trouvé une solution par hasard : j'ai modifié le contrôleur d'erreur pour qu'il envoie un e-mail en cas d'erreur dans notre environnement de production, mais je l'ai accidentellement configuré pour qu'il l'envoie également dans l'environnement de test ; lorsque l'une de ces erreurs s'est produite dans un test unitaire, j'ai reçu un e-mail détaillant l'erreur.

Vous n'êtes pas obligé d'utiliser la notification par courrier électronique, mais vous pouvez envisager la journalisation des erreurs à l'adresse suivante http://framework.zend.com/manual/en/zend.log.writers.html . Vous pouvez faire en sorte que les erreurs soient enregistrées dans un fichier journal, puis vérifier ce dernier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X