如何对Symfony2控制器进行单元测试?

Lew*_*ett 28 php unit-testing symfony

我想尽可能地使用测试驱动开发 - 这是一种很好的工作方式.

我对Symfony2控制器创建并返回一个新Response对象这一事实感到不安.

我希望能够单独测试控制器.

你怎么做呢?

答案是将控制器创建为Plain Old PHP Object,将其注册为服务并使用Dependency Injection将新Response对象(或Response工厂)传递给它?

Sgo*_*kes 54

通常,您的控制器将不同的对象插入在一起并按正确的顺序连接它们.也许他调用一个存储库,读取一些对象并通过render方法返回它们.也许他会打电话给其他一些做事的其他经理/经理.

这意味着控制器是高级组件.通常情况下,这表明功能测试是按顺序而不是单元测试.您不应该通过单元测试获得100%的代码覆盖率.也许你可以这样想:如果你对控制器调用的所有内容(模型,验证,表单,存储库)进行单元测试,那么可能出现什么问题?大多数时候,只有在生产中使用所有真正的类时才会观察到它.

我还想指出,TDD并不意味着一切都必须经过单元测试.可以对高级代码进行一些功能测试.如上所述,如果使用单元测试测试低级组件,则只应测试它们如何协同工作,而不能使用模拟测试,因为您告诉模拟返回值是什么.

如果您的控制器不仅仅是将系统的各个部分插在一起,那么您应该考虑将这些内容重构为更多的低级类,您可以使用单元测试进行测试.

所以我的建议是使用功能测试来测试你的控制器并使用单元测试来测试你的模型和你的业务逻辑.

如果您在使用功能测试时遇到困难,可以阅读以下内容: