【问题标题】:Symfony2 Unit Testing with Doctrine EntitiesSymfony2 使用 Doctrine 实体进行单元测试
【发布时间】:2013-02-18 13:16:14
【问题描述】:

我显然遗漏了一些非常明显的东西,但这让我发疯:

为了测试我的代码,我需要将我的实体置于已定义的状态。它根本行不通。它完全忽略了我所做的任何更改,例如这个:

    $this->test_character->setLocation(null);

    $crawler = $this->client->request('GET', '/en/character/start');
    $this->assertTrue($this->client->getResponse()->isSuccessful(), "start page failed to load");
    $this->assertGreaterThan(0, $crawler->filter('html:contains("Character Placement")')->count(), 'start page content failure');

调试此测试表明它失败了,因为实际上 Location 未设置为 null。添加一个 flush() 不会改变任何东西,所以这不是问题。我最好的猜测是它仅在测试客户端上更改它,而不是在生成页面的后端上更改它,但留下了一个问题:我如何将我的实体置于定义的状态以测试它们?

【问题讨论】:

  • $this->test_character 与测试有什么关系?当你测试你的后端时,你模拟了一个客户端(浏览器)访问它。您不应该做任何不同于客户对您的应用程序所做的事情。

标签: unit-testing symfony phpunit


【解决方案1】:

您说对了 - 处理您的测试请求的内核是您应用的一个独立实例。除非您在发出请求之前将其保存将其刷新到数据库,否则它将无法访问您可能已加载到 test_character 中的实体。

您是否考虑过使用Fixtures?如果您所做的只是初始化一些准备测试请求/响应的实体,那么这是正确的方法。您永远不需要在功能测试中直接使用实体。

您可能还想查看Liip functional test bundle 以自动设置您的测试数据库和测试装置。

【讨论】:

  • 谢谢。是的,我考虑过固定装置,但我有点不喜欢在 A 处定义数据集然后在 B 处依赖其特定细节的想法——我更愿意将其捆绑在一个地方。至少这是我这样做背后的想法。我会看看 Liip 包。
  • 我同意你的解决方案。这似乎是 Symfony 想要的方式。
  • 对不起 - 我错误地否决了这个。我以为我不小心投了赞成票并试图撤消它。除非编辑答案,否则它不会让我再次投票。
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2014-08-25
  • 1970-01-01
  • 2012-10-19
  • 2014-10-27
相关资源
最近更新 更多