symfony - 如何在功能 Controller 测试中使用 Doctrine 而不缓存结果?

标签 symfony doctrine-orm

这是我的场景。我们在 symfony 2 中编写了功能测试,其中测试设置引导内核:

public function setUp()
{
    $this->client = static::createClient();
    static::$kernel = static::createKernel();
    static::$kernel->boot();
    $container = static::$kernel->getContainer();

    $this->doctrine = $container->get('doctrine');
    $this->em = $this->doctrine->getManager();

    self::setupTestData();
}

最后一步是调用设置测试数据的例程。它将实体管理器 $this->em 传递给该例程。这一切都按预期工作,并且测试数据可供 Controller 中的代码使用。

Controller 更新一些相同的实体,因此在测试中我使用相同的实体管理器来获取这些数据并验证结果。根据记录,UI 没有这些可用字段,它们由不同的代码库使用,因此我们被迫在测试中加载实体并以这种方式进行验证。像:

$repository = $this->doctrine->getRepository('MyBundle:Namespace\AutoSearch');
$autoSearch = $repository->findBy(array('Autosearch_ID' => $this->autoSearchId));
//verify expected values

使用 findBy 或 DQL,我仅从测试设置中获取原始数据,而不是 Controller 修改的更新数据。如果我使用SQL,我可以看到修改后的数据。为什么?测试和 Controller 中不同实体管理器的实体跟踪?缓存?

感谢任何帮助

最佳答案

尝试添加:

$this->em->clear();

在访问您的(更新的)数据之前清除您的实体管理器。这将迫使实体管理器清除它可能对以前的对象的任何引用,并从您的连接中重新加载它们。这应该显示更新的数据。

关于symfony - 如何在功能 Controller 测试中使用 Doctrine 而不缓存结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20570520/

相关文章:

symfony - 使用 PHPUnit Bridge 测试可重用的 Symfony 包

forms - Symfony 2自定义表单字段类型:如何仅一次添加JavaScript和CSS?

php - 为什么 Symfony 提供 OrderedHashMap

php - 如何根据 session 中的值使用 Assetic 嵌入样式表

doctrine-orm - 学说 2 返回错误 'proxy directory must be writable'

sql - 使用带条件的内连接的 Doctrine 查询构建器

php - "No identifier/primary key specified for Entity"- 扩展 FOS 用户

forms - 如何在表单中仅加载 OneToMany 关联的子集?

symfony - Twig 的转储函数返回一个空白屏幕

php - Doctrine 实体管理器导致页面中断