php - Symfony2 功能测试 : Is a database required or not?

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

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

Controller 有两个方法(和路由):

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

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

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

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

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

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

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

最佳答案

这个问题的回答不是简单的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/

相关文章:

php - 下拉菜单中单独的 Powershell 输出

php - 寻找一种在php中的2个队列之间交替的有效方法

node.js - 使用 grunt-mocha-test 创建测试组

unit-testing - 未找到类 'Mockery'

symfony - 缓存文件夹增长得非常快

symfony - Doctrine2 不更新 DateTime

php - 如何使用另一个文件中的 PHP 类?

javascript - AJAX、PHP 表单未提交到数据库

unit-testing - 如何对存储库方法进行单元测试

php - 在 Symfony Controller 中访问容器