2010-07-15 7 views

Répondre

5

J'ai déjà créé un testeur dans ce but. Il est basé sur comment cela se fait dans la barre d'outils de débogage web (classe sfWebDebugPanelDoctrine).

J'ai étendu sfTesterDoctrine afin qu'il se comporte de la même manière. Seule la méthode d'assertion est ajoutée pour vérifier le nombre de requêtes.

Vous pouvez également écraser la méthode debug() pour afficher les statistiques de requête.

<?php 
/* 
* (c) 2010 Jakub Zalas 
* 
* For the full copyright and license information, please view the LICENSE 
* file that was distributed with this source code. 
*/ 

/** 
* @package  zTestPlugin 
* @subpackage test 
* @author  Jakub Zalas <[email protected]> 
*/ 
class zTesterDoctrine extends sfTesterDoctrine 
{ 
    /** 
    * @param integer $limit 
    * @return sfTestFunctionalBase|sfTester 
    */ 
    public function assertSqlCountLessThan($limit) 
    { 
    $queryCount = $this->countDoctrineEvents(); 

    $this->tester->cmp_ok($queryCount, '<', (int) $limit, sprintf('There are less than "%d" SQL queries performed', $limit)); 

    return $this->getObjectToReturn(); 
    } 

    /** 
    * @return integer 
    */ 
    protected function countDoctrineEvents() 
    { 
    return count($this->getDoctrineEvents()); 
    } 

    /** 
    * @return array 
    */ 
    protected function getDoctrineEvents() 
    { 
    if (!$databaseManager = $this->browser->getContext()->getDatabaseManager()) 
    { 
     throw new LogicConnection('The current context does not include a database manager.'); 
    } 

    $events = array(); 
    foreach ($databaseManager->getNames() as $name) 
    { 
     $database = $databaseManager->getDatabase($name); 
     if ($database instanceof sfDoctrineDatabase && $profiler = $database->getProfiler()) 
     { 
     foreach ($profiler->getQueryExecutionEvents() as $event) 
     { 
      $events[$event->getSequence()] = $event; 
     } 
     } 
    } 

    ksort($events); 

    return $events; 
    } 
} 

Exemple d'utilisation:

$browser = new sfTestFunctional(new sfBrowser()); 
$browser->setTester('doctrine', 'zTesterDoctrine'); 

$browser 
    ->get('/some/page') 
    ->with('response')->begin() 
    ->isStatusCode(200) 
    ->end() 
    ->with('doctrine')->begin() 
    ->assertSqlCountLessThan(20) // imagine how cool :) 
    ->end() 
->end(); 
+0

Nice. Est-ce réinitialisé sur une base par demande? – johnwards

+0

Oui. Chaque requête get() ou post() a un compteur séparé. Cela fonctionne de cette façon pour tous les testeurs non seulement pour le mien. –

+0

Idéal! Merci beaucoup, kuba. Juste si quelqu'un aura des erreurs - "Lass" doit être "Less", et -> begin() est manquant avant d'appeler. –