我试图对我的控制器进行单元测试,但我在互联网上找到的每个教程都说我应该使用$ this-> dispatch(“controller / action”)来运行我想要测试的特定操作。但是这样做,我不能模拟像数据映射器或其他方法的其他调用。
为了解决这个问题,我试图获得一个控制器类的实例,然后直接调用我想要测试的方法,但是这样做,我得到一个错误:
Zend_Exception: Setting request object manually is not allowed
我甚至不确定这是正确的方法,因为我真的不知道如何测试这样做的事情。
我的测试用例:http://pastie.org/1812717
我的ControllerTestCase:http://pastie.org/1812722
任何帮助将不胜感激。 谢谢。
答案 0 :(得分:3)
您有两种解决方案:
Zend_Test_PHPUnit_ControllerTestCase
它们都需要调度过程。第一个是调度应用程序,第二个是调度控制器。
从完整的Zend Framework包中查看手册和样本测试。
另外,请查看控制器源代码,了解如何管理依赖项。
另请参阅有关Zend Framework控制器的依赖注入的其他SO帖子。
答案 1 :(得分:2)
我猜想Zend_Test_PHPUnit_ControllerTestCase会阻止你模拟Requset和Response对象。我会绕过它,只是扩展PHPUnit_Framework_TestCase。正如我在另一个问题中提到的,我目前正在嘲笑控制器没有任何问题。
这是一个运行良好的示例测试:
AbstractRestController只是一个扩展Zend_Controller_Action
的控制器类答案 2 :(得分:1)
您的数据映射器(或其他对象)如何实例化?您是直接在控制器中实例化它还是从引导程序/注册表中获取它?如果使用注册表或引导程序,则将模拟放在注册表/引导程序中。
如果要直接在控制器中实例化,则需要修改控制器。也许有一个控制器方法来设置数据映射器,然后有另一种方法来获取数据映射器,如果没有设置,则实例化它。这允许您的测试注入模拟。
我通常不会在测试控制器时模拟很多类 - 我想测试整个应用程序及其呈现页面的能力......看起来你在数据库中没有测试任何记录,所以为什么不使用Zend_Test_PHPUnit_Db来为该测试设置一个空表,而不是模拟数据映射器以不返回任何数据?