Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 19-01-2011 14:27:25

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

[Résolu] Test des contrôleurs

Bonjour,

Je suis actuellement en train de tester mon application avec PHP Unit et je souhaite notamment vérifier les redirections de ces derniers pour vérifier les accès des utilisateurs (authentifié ou non pour commencer).

J'ai donc créé une classe abstraite étendant Zend_Test_PHPUnit_ControllerTestCase ci-dessous à partir de code que j'ai pu trouvé sur le net mais je rencontre des problèmes de redirections.
Lors d'une redirection, les assertions n'ont pas lieu et donc le test ne sert à rien.
J'ai tenté d'ajouter le code suivant dans mon bootstrap du ControllerTestCase :

Code:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->setExit(false);

Mais du coup, la redirection n'a pas lieu et le code continue de s'exécuter entraînant une erreur...

Quelqu'un saurait-il comment je dois faire ?

Dernière modification par r.monceau (21-02-2011 10:11:20)

Hors ligne

 

#2 19-01-2011 15:57:20

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs

Hello,

Tu n'as normalement pas besoin d'étendre quoi que ce soit smile. Tu as des méthodes pour justement tester les redirections :
- assertRedirect()
- assertNotRedirect()
- assertRedirectTo()
- assertNotRedirectTo()
- assertRedirectRegex()
- assertNotRedirectRegex()

Regardes ces slides : http://www.slideshare.net/mikaelkael/te … rk-5155326
Il y a quelques exemples.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 19-01-2011 16:10:30

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Oui j'ai testé le assertRedirect mais mon test unitaire ne renvoie aucun résultat.

Avec un seul test sans redirection :

Code:

public function test_InvokeLoginAction() {
    $this->dispatch('/auth/login');
    $this->assertController('auth');
}

Le résultat est le suivant :

Code:

PHPUnit 3.4.12 by Sebastian Bergmann.

.

Time: 1 second, Memory: 11.25Mb

OK (1 test, 1 assertion)

Si j'ajoute un second test qui doit rediriger :

Code:

public function test_InvokeAccountModify() {
    $this->dispatch('/account/modify');
    $this->assertRedirectTo('/auth/login');
}

J'obtiens le résultat suivant :

Code:

PHPUnit 3.4.12 by Sebastian Bergmann.

.

Quand je regarde la log, je vois bien que la redirection a eu lieu mais je n'ai pas le résultat de mes tests.


Ma classe abstraite n'est là que pour définir certaines méthodes communes à mes différents contrôleurs. Une habitude que j'ai prise en cas de besoin futur ^^

J'avais déjà jeter un oeil sur ton diaporama mais je vais sans doute le reparcourir wink

Hors ligne

 

#4 19-01-2011 16:43:25

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs

Hello,

Comment est le code de ton contrôleur ? Notamment comment fais-tu la redirection ?

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 19-01-2011 16:46:09

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Code:

public function init() {
    parent::init();
    if (!$this->_isConnected()) {
        $this->_redirectLogin();
    }
}

protected function _isConnected() {
    return Zend_Auth::getInstance()->hasIdentity();
}

protected function _redirectLogin() {
    $this->_redirect('auth/login');
}

Hors ligne

 

#6 19-01-2011 19:14:45

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs

Ok c'est correct de ce côté, qu'as-tu dans ton bootstrap de test ?


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 20-01-2011 10:32:13

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Mon loader.php :

Code:

// Define path to application directory
defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

defined('TMP_PATH') || define('TMP_PATH', realpath(APPLICATION_PATH .'/../tmp'));
defined('TEST_PATH') || define('TEST_PATH', realpath(APPLICATION_PATH .'/../tests'));

// Define default timezone
date_default_timezone_set('Europe/Paris');

// Require classes
require 'Zend/Application.php';
require 'Zend/Loader/Autoloader.php';

//Chargement automatique des classes
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

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

$application->bootstrap();
//            ->run();
            
// Seems to be required to make Zend_Session happy
Zend_Session::$_unitTestEnabled = true;
Zend_Session::start();

require_once TEST_PATH .'/Sql.php';

// Truncate database
Test_Sql::getAdapter()->query('TRUNCATE '. Model_DbTable_Impl::T_USR);
...

Ma classe Bootstrap :

Code:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    
    /**
     * Initialize caching as soon as possible
     * Define type, lifetime, etc.
     */
    protected function _initCaching() {
        $cache = $this->getOption('cache');
        FWK_Cache::setFilepath($cache['filepath']);
        FWK_Cache::setLifetime($cache['lifetime']);
        FWK_Cache::setType($cache['type']);
    }
    
    /**
     * Initialize i18n
     * Define locale with user session if authenticate
     */
    protected function _initI18n() {
        $i18n = $this->getOption('i18n');
        FWK_Translate::setAdapter($i18n['adapter']);
        $this->addLangs();
        // Default locale is english
        $locale = (Zend_Auth::getInstance()->hasIdentity()) ? 
                    Zend_Auth::getInstance()->getIdentity()->getLocale() : 'en';
        FWK_Translate::setLocale($locale);
        // Défine default adapter
        Zend_Registry::set('Zend_Translate', FWK_Translate::getI18n());
        Zend_Validate_Abstract::setDefaultTranslator(FWK_Translate::getI18n());
        Zend_Form::setDefaultTranslator(FWK_Translate::getI18n());
    }
    
    /**
     * Add languages for translations
     */
    private function addLangs() {
        FWK_Translate::addTranslation('en_EN.csv', 'en');
        FWK_Translate::addTranslation('fr_FR.csv', 'fr');
    }
    
    /**
     * Initialize doctype html
     */
    protected function _initDoctype()
    {
        $this->bootstrap('view');
        $view = $this->getResource('view');
        $view->doctype('XHTML11');
        $view = new Zend_View();
        $view->setEncoding('UTF-8');
    }

    /**
     * Initialize session namespace
     */
    protected function _initSession()
    {
        $session = new Zend_Session_Namespace('session');
    }
    
    /**
     * Init mailing
     */
    protected function _initMail() {
        $mail = $this->getOption('mail');
        Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Smtp($mail['smtp']));
        Zend_Mail::setDefaultFrom($mail['fromMail'],$mail['fromName']);
        Zend_Mail::setDefaultReplyTo($mail['replyto']);
    }
    
    /**
     * Passer un objet de cache de méta données général, pour toutes les classes de table
     * Puis passons le comme objet de cache par défaut pour éviter les requêtes DESCRIBE
     */
    protected function _initCachingDbMetadatas() {
        Zend_Db_Table_Abstract::setDefaultMetadataCache(FWK_Cache::getCache());
    }
}

Enfin mes tests unitaires sur les contrôleurs :
ControllerTestCase

Code:

require_once '/../loader.php';
abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    
    public function setUp()
    {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }
    
    protected function _loginUser() {
        $srv = new Service_Auth_Login(array('IN_LOGIN' => 'XXX', 'IN_PWD' => 'XXX'));
        $result = $srv->execute();
    }
    
    protected function _logoutUser() {
        Zend_Auth::getInstance()->clearIdentity();
    }
    
    public function tearDown() 
    {
        parent::tearDown();    
    }
    
    public function appBootstrap()
    {
        $this->application = new Zend_Application(
                APPLICATION_ENV,
                APPLICATION_PATH . '/configs/application.ini'
        );
        $this->application->bootstrap();
        $_SERVER['SERVER_NAME'] = 'http://127.0.0.1';
    }
    
    public function dispatch($url = null) {
        // redirector should not exit
//        $this->_redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
//        $this->_redirector->setExit(false);
        
        $request = $this->getRequest();
        if (null !== $url) {
            $request->setRequestUri($url);
        }
        $request->setPathInfo(null);
        
        $this->getFrontController()
                ->setRequest($request)
                ->setResponse($this->getResponse())
                ->throwExceptions(true)
                ->returnResponse(true);
        
        $this->getFrontController()->dispatch();
    }
}

IndexControllerTest.php

Code:

require_once '/../ControllerTestCase.php';
class IndexControllerTest extends ControllerTestCase
{
//    public function test_InvokeIndexAction() {
//        $this->dispatch('/');
//        $this->assertController('index');
//        $this->assertAction('index');
//    }
    
    public function test_InvokeLoginAction() {
        $this->dispatch('/auth/login');
        $this->assertController('auth');
    }
    
    public function test_InvokeAccountModify() {
        $this->dispatch('/account/modify');
        $this->assertRedirectTo('/auth/login');
    }
}

Voila je pense que tu as tout smile Certaines méthodes ne sont pas encore commentées et je m'en excuse =/
Mes classes commençant par FWK_ font parties d'une "surcouche" de ZF.

Le bootstrap est appelée plusieurs fois. Une fois avec le loader et une seconde au niveau du setUp() de chaque test.

Merci.

Hors ligne

 

#8 20-01-2011 11:45:35

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs

Hello,

Essayes avec :

Code:

    ->throwExceptions(false)

Ça devrait marcher

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#9 20-01-2011 11:48:48

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Salut,

Je viens d'essayer mais nan ça marche pas ^^

Hors ligne

 

#10 20-01-2011 14:02:29

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs

Hello,

Supprimes complètement la méthode dispatch() présente dans ControllerTestCase. Elle surcharge celle dans Zend_Test_PHPUnit_ControllerTestCase en lui enlevant trop de choses.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#11 20-01-2011 14:40:48

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Re,

Si je l'enlève, il fait comme si la redirection n'existait pas. Il passe bien dans la méthode _redirectLogin() puis continue son chemin (puisque la méthode dispatch de Zend_Test_PHPUnit_ControllerTestCase met le setExit à false je présume).
Du coup, la suite de mon script s'exécute et tente d'accéder à la session (null puisque l'utilisateur n'est pas connecté).

Dois-je rajouter quelque chose dans mes méthodes de redirection pour que mon contrôleur redirige puis stoppe tout traitement ? Faut-il mettre la redirection à un autre endroit que la méthode init (preDispatch par exemple) ?

Merci en tout cas wink

Hors ligne

 

#12 22-01-2011 00:00:23

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Test des contrôleurs


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#13 03-02-2011 09:56:50

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Salut,

Il semble que je n'ai pas trop la possibilité de tester mes contrôleurs du coup. J'espère que ce bug sera corrigé dans la version 2 de ZF.

Merci beaucoup pour le temps passé à m'aider wink

Hors ligne

 

#14 17-02-2011 16:14:36

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Salut,

Je ne sais quel miracle s'est produit mais les tests fonctionnent correctement aujourd'hui... Cependant, je suis confronté à un nouveau problème pour lequel, je ne trouve pas de solutions.

Il s'agit tout simplement de tester une variable envoyée à la vue. Lorsque dans mon contrôleur, je fais :

Code:

$this->view->message = "Hello World";

J'aimerai pouvoir tester si j'ai bien affecté à ma vue la même variable.. A partir du front controller, je parviens à voir la variable et sa valeur par un dump mais je n'arrive pas à accéder juste à la valeur pour effectuer une assertion.

Est-ce que quelqu'un saurait me dire comment faire ou orienter mes recherches sur le net ?

Merci.

Hors ligne

 

#15 21-02-2011 10:10:35

r.monceau
Membre
Date d'inscription: 02-11-2009
Messages: 59

Re: [Résolu] Test des contrôleurs

Si jamais quelqu'un cherche..

Code:

Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->view;

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages