3

我希望我可以有一个 isSQLCountLessThan() 函数或其他东西。

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

有没有办法拥有这样的?

4

1 回答 1

5

我曾经为此目的创建了测试器。它基于它在 Web 调试工具栏(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();
于 2010-07-15T15:22:02.407 回答