Symfony2功能测试:是否需要数据库?

时间:2015-06-12 09:52:08

标签: php unit-testing symfony doctrine-orm functional-testing

我必须为在应用程序中注册用户的控制器编写功能测试。

控制器有两种方法(和路线):

  • registrationAction(route = registration)
  • endAction(route = registration / end)

现在我想为这两种方法编写功能测试。

我的问题是:当控制器在数据库中创建并保留新用户时,我应该使用测试数据库吗?实体经理的嘲笑是解决方案吗?如何测试用户是否在数据库中正确创建?

Symfony的文档,关于functional testing of forms,没有提到数据库,但通常是填写表格和提交。但是如果我尝试在功能测试中做同样的事情,他们会返回错误(我认为他们是对的:没有数据库可以保存提交的数据!)。

所以,我认为我应该使用数据库进行功能测试,但我不明白为什么:

  1. Symfony的文档没有提到数据库
  2. 有人建议使用实体管理器的模拟。
  3. 我有点困惑:应该让我使用数据库吗?

1 个答案:

答案 0 :(得分:4)

回答这个问题并不简单yes / no,你可以用两种方式来做,都有其优点和缺点。

<强> 1。使用测试数据库

你提到你需要编写控制器测试。测试控制器正在测试您的应用程序流程的几乎顶层。如果您希望使用隔离测试控制器逻辑,则控制器依赖于您需要模拟的许多类实现。如果你的控制器使用service container将它的依赖注入到构造函数中,我可能会想到嘲笑但是如果它扩展了Symfony的Controller我将使用测试数据库模拟在这种情况下的一切都会很苛刻。

<强> 2。没有数据库

在这种情况下,您需要模拟entity manager,这是可能的。但是在你的情况下,我会想到重构。将控制器外部的逻辑移动到某个UserManager或类似的类。将此类注册为服务并注入所有必需的依赖项。考虑注入存储库而不是整个EntityManager,如here所述。现在,因为您的代码更单一,所以编写测试更容易,并且更容易模拟所有依赖项。

结论:进行重构,将逻辑移出控制器,通过向其中注入多个依赖项来为单个负责类编写测试。