Caching Symfony 1.4功能测试不显示新数据

Caching Symfony 1.4功能测试不显示新数据,caching,symfony-1.4,functional-testing,Caching,Symfony 1.4,Functional Testing,我正在对我的Symfony 1.4项目运行一个功能测试,它一直失败,因为它无法获取最新数据 测试将创建一个新的站点条目,然后在站点上进行调查,然后将数据添加到调查中。每一个都在单独的页面和每个作品上。数据肯定存在于数据库中。保存最后一个表单“调查数据”后,它将返回到“调查”页面,在该页面中,它将获取调查详细信息以及添加到其中的所有数据项的列表。这在dev和prod环境中有效,但在我的功能测试中,survey_数据列表为空。通过查看日志,它不会试图从数据库中获取数据(条令和Postgres)。但是

我正在对我的Symfony 1.4项目运行一个功能测试,它一直失败,因为它无法获取最新数据

测试将创建一个新的站点条目,然后在站点上进行调查,然后将数据添加到调查中。每一个都在单独的页面和每个作品上。数据肯定存在于数据库中。保存最后一个表单“调查数据”后,它将返回到“调查”页面,在该页面中,它将获取调查详细信息以及添加到其中的所有数据项的列表。这在dev和prod环境中有效,但在我的功能测试中,survey_数据列表为空。通过查看日志,它不会试图从数据库中获取数据(条令和Postgres)。但是,如果几秒钟后我在浏览器中手动加载页面,列表就在那里,如果我运行直接进入页面的测试(不清除数据库),列表就在那里,因此测试登录名有权查看该页面和内容,但一开始不会显示它,就像在添加调查数据之前缓存了页面调查页面一样

因此,我的问题是,如何确保我的功能测试从数据库获取最新数据,或者如何在将新项保存到数据库后刷新本地数据对象缓存

其他:
我的功能测试扩展了
sfPHPUnitBaseFunctionalTestCase
,我使用sfBrowser类检查页面的内容并在其中导航

问题似乎是在执行期间缓存它更新的任何对象。这会在生产环境中的每个web请求(每次执行一个请求)后清除,但在测试环境中,它似乎会在请求之间保持,因为它们都发生在同一执行中

当测试向列表中添加新项目的过程时,会变得很麻烦-列表在内存中(测试浏览器以前已经访问过它的页面),新项目会被创建、保存,但它们之间的链接不会在内存中形成

有针对性地刷新相关对象 如果知道要强制刷新的对象,可以:

$SomeDoctrineRecordObject->refreshRelated();          // for all relationships
$SomeDoctrineRecordObject->refreshRelated($relation); // for a specific one
(对于上面的列表和项目示例,您需要
$List->refreshRelated('Item')

这只有在您已经在使用Doctrine对象时才有用,否则每次需要刷新时都必须将其从路由或数据库中拉出。更通用的方法是扩展
sfTestFunctional
类并重写可能导致关系更改的方法,因此需要触发刷新

所有对象的常规刷新 清除条令的对象缓存的代码:

$manager = Doctrine_Manager::getInstance();
$connection = $manager->getCurrentConnection();
$tables = $connection->getTables();
foreach ( $tables as $table ) {
  $table->clear();
}
以及如何将其连接到自定义功能测试对象的示例:

class myTestFunctional extends sfTestFunctional
{
  public function get( $uri, $parameters = array(), $changeStack = true )
  {
    $this->clearEntityCache();
    return parent::get( $uri, $parameters, $changeStack );
  }
  public function click( $name, $arguments = array(), $options = array() )
  {
    $this->clearEntityCache();
    return parent::click( $name, $arguments, $options );
  }
  protected function clearEntityCache()
  {
    $manager = Doctrine_Manager::getInstance();
    $connection = $manager->getCurrentConnection();
    $tables = $connection->getTables();
    foreach ( $tables as $table ) {
      $table->clear();
    }
  }
}

因此,每次
myTestFunctional
获取url或单击以更改页面时,它都会清除存储在内存中的任何条令对象。不是很微妙,但是很有效,并且不会使测试本身更难编写

“它不试图获取数据”是什么意思?这是否意味着不执行调查数据详细信息中的数据库查询?如果是这种情况,可能您的功能测试没有将您的用户重定向到正确的页面?正确,不会执行对子数据详细信息的查询。它正在返回到正确的页面,我通过检查返回页面的源代码和报告它使用的操作和视图的调试语句来确认这一点。