Zend framework 如何对zend action controller进行单元测试?

Zend framework 如何对zend action controller进行单元测试?,zend-framework,tdd,phpunit,actioncontroller,Zend Framework,Tdd,Phpunit,Actioncontroller,我需要用php和zend框架快速构建好的软件。我试着用TDD的方式来实现这一点,因为它的员工比我更有经验,他们告诉我这是快速构建代码的最佳方式,同时保持代码的可管理性 所以我得到了关于phpunit的书,并且很好地进行了,事实上,在最初的麻烦之后,它开始加速,代码仍然很好。我有点喜欢我的对象可以单独测试 然而,测试zend action controller有一个主要问题。zend_测试包提供了一种测试它的方法。但这似乎可以同时测试整个应用程序。我似乎无法很好地存根或模拟任何存储库或注入任何其他

我需要用php和zend框架快速构建好的软件。我试着用TDD的方式来实现这一点,因为它的员工比我更有经验,他们告诉我这是快速构建代码的最佳方式,同时保持代码的可管理性

所以我得到了关于phpunit的书,并且很好地进行了,事实上,在最初的麻烦之后,它开始加速,代码仍然很好。我有点喜欢我的对象可以单独测试

然而,测试zend action controller有一个主要问题。zend_测试包提供了一种测试它的方法。但这似乎可以同时测试整个应用程序。我似乎无法很好地存根或模拟任何存储库或注入任何其他依赖项。因此,我无法像在项目的其余部分那样对它们进行广泛的测试,这表明了这一点

我一直想解决这个问题。但我在网上只能找到zend_测试的方法


我想知道你对此的看法。也许我只是想做得太多,或者也许有更好的方法来开发zend action控制器的单元测试

在Zend 1中,控制器是一个普通类。您可以对其进行实例化,也可以对其调用方法(例如,使用存储库的PHPUnit mock替换默认存储库:

class MyController extends Zend_Controller_Action
{
   public functioni init()
   {
      $this->repository = new MyRepository();
   }

   public function setRepository($repository)
   {
      $this->repository = $repository;
   }

   public function saveAction()
   {
      $dataToWrite = manipulate in some way $this->getRequest()->getParams();
      $this->repository->update($dataToWrite, ...);
   }
}
但是您还必须注入一个请求,并分派它以获得响应


就我个人而言,对于控制器,我更喜欢编写功能测试而不是单元测试(使用
Zend_Test
)。速度较慢,您可能需要内存中的sqlite数据库,等等。但您将知道您的应用程序是否真正工作:您可以对每个类进行单元测试,但如果连接对象的工厂出错,您将继续得到一个绿色的PHPUnit条和一个损坏的应用程序。

Rob Allen写了一篇关于测试Zend Contro的文章ller使用PHPUnit执行操作。它使用
Zend_Test\u PHPUnit_ControllerTestCase
,引导整个应用程序并测试响应

PHPUnit和功能测试通常不适合测试控制器。相反,控制器不适合进行单元测试。我的意思是,单元测试的概念与控制器层的概念不符,控制器的构造方式通常会使它们本身难以进行单元测试


我能建议的最好的替代方法是使用。这测试来自控制器的响应(因此在大多数情况下真正测试视图)。在Selenium测试的基础上,您还应该对您的模型和库的其他部分进行单元测试。这是您在控制器层所能做到的防弹性能。

谢谢,我确实看到了对软件进行功能测试的必要性,因为我仍然是手工测试的,所以也许我应该为此制作一个测试套件。我不想这样做将它们与单元测试一起运行(但可能是错误的)我将尝试实例化,因为我想知道视图中有哪些对象。您可以避免运行它们。例如,如果功能测试太多或太慢,使用PHPUnit,您可以使用
@group functional
标记测试用例,并运行
PHPUnit--group$groupname
。但在提交/推送源代码之前,请先将您的测试用例标记为
@group functional
,然后运行
PHPUnit--group$groupname
elf确保每项测试都能正常运行!谢谢,我确实找到了这篇文章,我听说我可以将selenium与phpunit集成,所以这是一种优雅的方式。