mai
2008
Hier soir j’ai commité un patch (en 2 commits car je me suis gourré comme un gros malin ) pour le Zend Framework, concernant un problème dans l’authentification HTTP.
Un bon exemple d’utilisation des stubs objects (on peut les appeller mock object aussi, ou trompe-l’oeil).
L’adaptateur HTTP d’authentification, va lire la requête HTTP à la recherche des en-tête Authorization, ou Proxy-Authorization, puis résoudre le challenge, et enfin compléter la réponse HTTP en lui joignant le bon code HTTP de retour.
C’est classique, pas très complexe, mais pour tester ça, c’est un peu plus difficile.
En effet, PHPUnit est un outil remarquable, mais son seul problème est les en-têtes. PHPUnit s’execute dans un environnement CLI, il n’y a donc pas moyen de créer une requête HTTP. Vous ne pouvez à aucun moment générer des en-têtes HTTP dans vos codes, car ils risquent d’entrer en conflit avec le test runner.
Heureusement, nous disponsons d’un modèle MVC et donc d’objets de requête et de réponse HTTP. Mais ceux-ci jouent avec les en-têtes HTTP (logique), et perturbent le fonctionnement de PHPUnit.
Donc tester du HTTP (et c’est pareil pour les sessions), est une prise de tête, à première vue seulement…
Comment donc tester ce composant ? ( Zend_Session c’est pareil, c’est assez complexe d’en écrire des tests)
En utilisant un simulacre ! (ou trompe-l’oeil)
public function testUnsupportedScheme()
{
$response = $this->getMock('Zend_Controller_Response_Http');
$request = $this->getMock('Zend_Controller_Request_Http');
$request->expects($this->any())
->method('getHeader')
->will($this->returnValue('NotSupportedScheme <followed by a space caracter'));
$a = new Zend_Auth_Adapter_Http($this->_digestConfig);
$a->setDigestResolver($this->_digestResolver)
->setRequest($request)
->setResponse($response);
$result = $a->authenticate();
$this->assertEquals($result->getCode(),Zend_Auth_Result::FAILURE_UNCATEGORIZED);
}
Voyez la méthode getMock renvoie une sorte d’objet de la classe qu’on lui demande, puis ensuite nous le configurons à notre sauce.
On s’attend donc à ce que la requête se fasse appeler sa méthode ‘getHeader’, autant de fois qu’il faut (any), et elle devra retourner ‘NotSupportedScheme <followed by a space caracter’.
Nous avons trompé notre composant Zend_Auth_Adapter_Http, en lui faisant croire qu’il allait manipuler un objet Zend_Controller_Request_HTTP (comme c’est le cas normalement), mais nous lui en avons passer un simulacre éphémère, configuré pile comme il faut, et il n’a pas bronché du tout
Voila, PHPUnit est super, et encore, vous n’avez pas vu comment simuler une base de données avec
Ca sera le sujet d’un éventuel prochain article ^^
Commentaires récents
Archives
- novembre 2010
- août 2010
- juillet 2010
- juin 2010
- mai 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007