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

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

问题描述:

我试图单元测试我的控制器,但我在互联网上找到的每个教程都说我应该使用$ this-> dispatch(“controller/action”)来运行我想测试的特定动作。但是像这样做,我不能嘲笑任何类似数据映射器或其他方法的其他调用。如何使用PHPUnit测试和模拟zend框架控制器?

为了解决这个问题,我试图让控制器类的实例,然后直接打电话给我想测试方法,做起来这个样子,我得到一个错误:

Zend_Exception: Setting request object manually is not allowed 

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

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

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

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

有两种解决方法:

  1. 伪单元测试(更像验收测试)与Zend_Test_PHPUnit_ControllerTestCase
  2. 创建控制器的新实例,通过所有必需的依赖(调度,请求,响应,插件管理器等等)

他们俩实际上都需要调度过程。第一,调度应用程序,第二,调度控制器。

请参阅完整的Zend Framework包中的手册和样本测试。

此外,请查看控制器源代码,以了解依赖关系是如何管理的。

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

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

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

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

+0

在控制器的init()方法的控制器类,IM设置属性$这 - > _mapper与映射器的实例,但对于其他映射器即时调用控制器方法内的“新的MyMapper”。我想在BasicController类或类似的东西中创建一个新的方法调用getMapper()。 但正如我所说,当我试图获得一个实例时,我得到这个错误,所以我无论如何不能这样做。 – fiunchinho 2011-04-19 21:52:50

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

下面是运行正常的示例测试:

http://pastie.org/1816705

AbstractRestController仅仅是延伸化Zend_Controller_Action