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

Symfony2 Functional Testing: Is a database required or not?

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

控制器有两个方法(和路由):

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

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

Symfony 的文档,说到functional testing of forms,没有提到数据库,一般都是表单的填写和提交。但是如果我尝试在我的功能测试中做同样的事情,他们 return 错误(我认为他们是正确的:没有数据库可以保存提交的数据!)。

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

  1. Symfony 的文档没有提到数据库
  2. 有人建议使用实体管理器的模拟。

我有点困惑:我是否应该使用数据库?

这个问题的回答并不简单yes/no,两种方式都可以,各有优缺点。

1.带测试数据库

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

2。没有数据库

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

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