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

标签 caching symfony-1.4 functional-testing

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

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

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

附加: 我的功能测试扩展了 sfPHPUnitBaseFunctionalTestCase,并且我使用 sfBrowser 类来检查页面内容并浏览它们

最佳答案

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

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

相关对象定向刷新

如果您知道要强制刷新哪个对象,您可以:

$SomeDoctrineRecordObject->refreshRelated();          // for all relationships
$SomeDoctrineRecordObject->refreshRelated($relation); // for a specific one

(对于上面的列表和项目示例,您需要 $list->refreshRelated('item') )

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

所有对象的常规刷新

清除 Doctrine 对象缓存的代码:

$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 或单击更改页面时,它都会清除内存中存储的任何 Doctrine 对象。不微妙,但有效,并且不会使测试本身更难以编写!

关于caching - Symfony 1.4 功能测试不显示新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17644739/

相关文章:

c# - 尝试获取 ICacheManager 类型的实例时发生激活错误, key \"\"“

php - 如何仅使用我的更改来更新我的 symfony 模块?

symfony1 - 带 * 的 Doctrine 查询

php - Symfony 功能测试失败,但相同的请求在浏览器中有效

caching - 默认情况下禁用 Redshift 缓存

java - 这个缓存线程安全吗?

html - 除非用户清除缓存,否则不会在网站上显示新内容

symfony1 - Doctrine 记录监听器从未被解雇

functional-testing - 逐步进行实习生功能测试

symfony - 如何在 liip 功能测试(symfony 2.8)中附加固定装置?