如何使用PHPUnit测试和模拟zend framework控制器?

如何使用PHPUnit测试和模拟zend framework控制器?,php,zend-framework,mocking,phpunit,Php,Zend Framework,Mocking,Phpunit,我试图对我的控制器进行单元测试,但是我在互联网上找到的每个教程都说我应该使用$this->dispatch(“控制器/操作”)来运行我想要测试的特定操作。但是这样做,我不能模仿任何东西,比如数据映射器,或者对其他方法的其他调用 为了解决这个问题,我尝试获取控制器类的一个实例,然后直接调用我想要测试的方法,但是这样做,我得到了一个错误: Zend_Exception: Setting request object manually is not allowed 我甚至不确定这是正确的方法,因为我

我试图对我的控制器进行单元测试,但是我在互联网上找到的每个教程都说我应该使用$this->dispatch(“控制器/操作”)来运行我想要测试的特定操作。但是这样做,我不能模仿任何东西,比如数据映射器,或者对其他方法的其他调用

为了解决这个问题,我尝试获取控制器类的一个实例,然后直接调用我想要测试的方法,但是这样做,我得到了一个错误:

Zend_Exception: Setting request object manually is not allowed
我甚至不确定这是正确的方法,因为我真的不知道我将如何测试这样做的事情

我的测试用例:

我的控制器测试用例:

任何帮助都将不胜感激。 谢谢。

您的数据映射器(或其他对象)是如何实例化的?您是直接在控制器中实例化它还是从引导/注册表中获取它?如果使用注册表或引导,则将模拟放在注册表/引导中

如果直接在控制器中实例化,则需要修改控制器。可能有一个控制器方法来设置数据映射器,然后有另一个方法来获取数据映射器,如果没有设置,则实例化它。这允许您的测试注入模拟


在测试控制器时,我通常不会模拟很多类-我想测试整个应用程序及其呈现页面的能力。。。看起来您没有测试数据库中的任何记录,那么为什么不使用Zend_Test_PHPUnit_Db为该测试设置一个空表,而不是模拟数据映射器以不返回任何数据呢

您有两种解决方案:

  • 使用
    Zend\u Test\u PHPUnit\u ControllerTestCase
  • 创建控制器的新实例,传递所有必需的依赖项(调度程序、请求、响应、插件管理器等)
  • 它们实际上都需要调度过程。第一,分派应用程序,第二,分派控制器

    请参阅完整Zend Framework包中的手册和示例测试

    另外,请查看控制器源代码,了解如何管理依赖关系


    另请参阅其他有关Zend Framework控制器依赖项注入的SO帖子。

    我猜Zend_Test_PHPUnit_ControllerTestCase会阻止您模拟请求和响应对象。我会绕过它,只是扩展PHPUnit_框架_测试用例。正如我在另一个问题中提到的,我目前正在模拟控制器,没有任何问题

    下面是一个运行良好的示例测试:

    AbstractRestController只是一个控制器类,它扩展了控制器的init()方法中的Zend_controller_Action

    ,我使用映射器的实例设置属性$this->_mapper,但对于其他映射器,我在控制器方法中直接调用“new MyMapper”。我正在考虑在BasicController类或类似的类中创建一个新的方法调用getMapper()。但正如我所说的,当我尝试获取一个实例时,我得到了那个错误,所以我无论如何都不能这样做。