如何使用PHPUnit测试和模拟zend framework控制器?
我试图对我的控制器进行单元测试,但是我在互联网上找到的每个教程都说我应该使用$this->dispatch(“控制器/操作”)来运行我想要测试的特定操作。但是这样做,我不能模仿任何东西,比如数据映射器,或者对其他方法的其他调用 为了解决这个问题,我尝试获取控制器类的一个实例,然后直接调用我想要测试的方法,但是这样做,我得到了一个错误:如何使用PHPUnit测试和模拟zend framework控制器?,php,zend-framework,mocking,phpunit,Php,Zend Framework,Mocking,Phpunit,我试图对我的控制器进行单元测试,但是我在互联网上找到的每个教程都说我应该使用$this->dispatch(“控制器/操作”)来运行我想要测试的特定操作。但是这样做,我不能模仿任何东西,比如数据映射器,或者对其他方法的其他调用 为了解决这个问题,我尝试获取控制器类的一个实例,然后直接调用我想要测试的方法,但是这样做,我得到了一个错误: Zend_Exception: Setting request object manually is not allowed 我甚至不确定这是正确的方法,因为我
Zend_Exception: Setting request object manually is not allowed
我甚至不确定这是正确的方法,因为我真的不知道我将如何测试这样做的事情
我的测试用例:
我的控制器测试用例:
任何帮助都将不胜感激。
谢谢。您的数据映射器(或其他对象)是如何实例化的?您是直接在控制器中实例化它还是从引导/注册表中获取它?如果使用注册表或引导,则将模拟放在注册表/引导中
如果直接在控制器中实例化,则需要修改控制器。可能有一个控制器方法来设置数据映射器,然后有另一个方法来获取数据映射器,如果没有设置,则实例化它。这允许您的测试注入模拟
在测试控制器时,我通常不会模拟很多类-我想测试整个应用程序及其呈现页面的能力。。。看起来您没有测试数据库中的任何记录,那么为什么不使用Zend_Test_PHPUnit_Db为该测试设置一个空表,而不是模拟数据映射器以不返回任何数据呢 您有两种解决方案:
Zend\u Test\u PHPUnit\u ControllerTestCase
另请参阅其他有关Zend Framework控制器依赖项注入的SO帖子。我猜Zend_Test_PHPUnit_ControllerTestCase会阻止您模拟请求和响应对象。我会绕过它,只是扩展PHPUnit_框架_测试用例。正如我在另一个问题中提到的,我目前正在模拟控制器,没有任何问题 下面是一个运行良好的示例测试: AbstractRestController只是一个控制器类,它扩展了控制器的init()方法中的Zend_controller_Action,我使用映射器的实例设置属性$this->_mapper,但对于其他映射器,我在控制器方法中直接调用“new MyMapper”。我正在考虑在BasicController类或类似的类中创建一个新的方法调用getMapper()。但正如我所说的,当我尝试获取一个实例时,我得到了那个错误,所以我无论如何都不能这样做。