2011-09-22 100 views
4

我需要在php中快速构建好的软件并使用zend框架。我试图以TDD的方式参与这项工作,因为它比我更有经验的人告诉我这是在保持代码易于管理的同时快速构建的最佳方式。如何对zend动作控制器进行单元测试?

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

然而,测试zend动作控制器存在一个主要问题。 zend_test包提供了一种测试方法。但这似乎是一次测试整个应用程序。我似乎无法很好地存根或模拟任何存储库或注入任何其他依赖项。所以我一直没能像测试其他项目一样对它们进行广泛的测试,结果如图所示。

我一直在寻找解决这个问题。但是我能在网上找到的就是zend_test的做法。

我想知道您对此的看法。也许我只是想做些事情,或者有更好的方法来开发zend动作控制器的单元测试。

回答

1

在Zend 1控制器是一个普通的类。你可以实例化它,你可以调用它的方法(例如,用你的资料库的PHPUnit的模拟替代默认的库:

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吧,它有一个破坏的应用程序。

+0

谢谢,的确,我看到了需要对软件进行功能测试,我仍然需要手动完成,所以也许我应该为此做一个测试套件。我不认为我不想和单元测试一起运行它们。 (但可能是错误的。)我会试试instanciate,因为我想知道视图中有什么对象。 – Bram

+0

您可以避免运行它们。例如,如果功能测试太慢或太慢,使用PHPUnit,您可以用'@group functional'标记测试用例并运行'phpunit --group $ groupname'。但在提交/推送源代码之前,请确保所有测试都运行正常! – Francesco

1

Rob Allen在使用PHPUnit测试Zend Controller Actions时写了一个very good article。这使用Zend_Test_PHPUnit_ControllerTestCase,它引导整个应用程序并测试响应。

PHPUnit和功能测试通常不适合测试控制器。相反,控制器不适合单元测试。因此,我的意思是单元测试的概念对控制层的概念没有意义,并且控制器通常以一种使得它们固有地难以进行单元测试的方式来构建。

我建议的最佳选择是使用Selenium。这测试了来自控制器的响应(所以在大多数情况下真的测试查看)。在Selenium测试之上,您还应该对模型和库的其余部分进行单元测试。这几乎是无懈可击的,因为你可以真正进入控制器层。

+0

谢谢,我找到了artical,我听说我可以将php和phpunit集成在一起,所以这是一种优雅的方式。 – Bram

相关问题