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

时间:2011-04-19 19:19:41

标签: php zend-framework mocking phpunit

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

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

Zend_Exception: Setting request object manually is not allowed

我甚至不确定这是正确的方法,因为我真的不知道如何测试这样做的事情。

我的测试用例:http://pastie.org/1812717

我的ControllerTestCase:http://pastie.org/1812722

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

3 个答案:

答案 0 :(得分:3)

您有两种解决方案:

  1. 使用Zend_Test_PHPUnit_ControllerTestCase
  2. 进行伪单元测试(更像是验收测试)
  3. 创建Controller的新实例,传递所有必需的依赖项(调度程序,请求,响应,插件管理器等)。
  4. 它们都需要调度过程。第一个是调度应用程序,第二个是调度控制器。

    从完整的Zend Framework包中查看手册和样本测试。

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

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

答案 1 :(得分:2)

我猜想Zend_Test_PHPUnit_ControllerTestCase会阻止你模拟Requset和Response对象。我会绕过它,只是扩展PHPUnit_Framework_TestCase。正如我在另一个问题中提到的,我目前正在嘲笑控制器没有任何问题。

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

  

http://pastie.org/1816705

AbstractRestController只是一个扩展Zend_Controller_Action

的控制器类

答案 2 :(得分:1)

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

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

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