Проверить, что каждая страница не превышает допустимое количество SQL в Symfony? - PullRequest
3 голосов
/ 15 июля 2010

Хотелось бы иметь функцию isSQLCountLessThan () или что-то в этом роде.

$browser = new sfTestFunctional(new sfBrowser());
$browser
  ->get('/some/page')
  ->with('response')->begin()
    ->isStatusCode(200)
    // ...
    ->isSQLCountLessThan(20) // imagine how cool :)
  ->end();

Есть ли способ получить такое?

1 Ответ

5 голосов
/ 15 июля 2010

Я однажды создал тестер для этой цели. Он основан на том, как это делается на панели инструментов веб-отладки (класс sfWebDebugPanelDoctrine).

Я расширил sfTesterDoctrine, чтобы он вел себя так же. Для проверки количества запросов добавлен только метод подтверждения.

Вы также можете перезаписать метод debug () для отображения статистики запросов.

<?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 <jakub@zalas.pl>
 */
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;
  }
}

Пример использования:

$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();
...