我必须为在应用程序中注册用户的 Controller 编写功能测试。
Controller 有两个方法(和路由):
registrationAction
(route=registration)endAction
(route=registration/end)
现在我想为这两种方法编写功能测试。
我的问题是:当 Controller 在数据库中创建并保存一个新用户时,我应该使用测试数据库吗?实体管理器的 mock 是一种解决方案吗?以及如何测试用户是否已在数据库中正确创建?
Symfony 的文档,谈论 functional testing of forms , 不提数据库,一般就是表单的填写和提交。但是,如果我尝试在我的功能测试中做同样的事情,它们会返回错误(我认为它们是正确的:没有数据库可以保存提交的数据!)。
所以,我认为我应该使用数据库进行功能测试,但我不明白为什么:
- Symfony 的文档没有提到数据库
- 有人建议使用实体管理器的模拟。
我有点困惑:我是否应该使用数据库?
最佳答案
这个问题的回答不是简单的yes
/no
,两种方式都可以,各有优缺点。
<强>1。带测试数据库
您提到您需要编写 Controller 测试。测试 Controller 正在测试应用程序流程的几乎顶层。 Controller 依赖于许多类实现,如果您想隔离测试 Controller 逻辑,则需要模拟这些实现。如果你的 Controller 使用 service container
将它的依赖项注入(inject)到构造函数中,我可能会想到模拟,但如果它扩展了 Symfony 的 Controller
我会使用测试数据库模拟一切,在这种情况下将是刺耳。
<强>2。没有数据库
在这种情况下,您需要模拟您的实体管理器
,这是可能的。但是,在您的情况下,我会考虑重构。将 Controller 外部的逻辑移至某个 UserManager
或类似类。将此类注册为服务并注入(inject)所有必需的依赖项。考虑注入(inject)存储库而不是整个 EntityManager,如所述 here .现在,因为您的代码更加单一,所以编写测试更容易,模拟所有依赖项也更容易。
结论:进行重构,将您的逻辑移出 Controller ,通过向其中注入(inject)依赖项模拟来为单个负责的类编写测试。
关于php - Symfony2 功能测试 : Is a database required or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800180/