【问题标题】:How do I unit test the zend action controller?如何对 zend 动作控制器进行单元测试?
【发布时间】:2011-11-23 03:03:27
【问题描述】:

我需要使用 php 并使用 zend 框架快速构建好的软件。我尝试以 TDD 的方式来解决这个问题,因为它的人比我更有经验告诉我,这是快速构建同时保持代码可管理的最佳方式。

所以我得到了关于 phpunit 的书,并且进展顺利,确实在最初的麻烦之后它开始加速并且代码仍然很好。我很喜欢如何单独测试我的对象。

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

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

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

【问题讨论】:

    标签: zend-framework tdd phpunit actioncontroller


    【解决方案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 条,其中包含一个损坏的应用程序。

    【讨论】:

    • 谢谢,我确实看到了对软件进行功能测试的必要性,而我仍然手动进行,所以也许我应该为此制作一个测试套件。我不认为我不想将它们与单元测试一起运行。 (但可能是错误的。)我会尝试实例化,因为我想知道视图中有哪些对象。
    • 你可以避免运行它们。例如,如果功能测试太多或太慢,使用 PHPUnit,您可以使用@group functional 标记测试用例并运行phpunit --group $groupname。但在提交/推送您的源代码之前,请确保一切正常运行您拥有的每个测试!
    【解决方案2】:

    Rob Allen 写了一篇very good article,介绍了使用 PHPUnit 测试 Zend 控制器动作。这使用了Zend_Test_PHPUnit_ControllerTestCase,它引导整个应用程序并测试响应。

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

    我可以建议的最佳选择是使用Selenium。这会测试来自控制器的响应(因此在大多数情况下会真正测试 View)。除了 Selenium 测试之外,您还应该对模型和库的其余部分进行单元测试。这几乎是您真正可以在控制器层中获得的防弹。

    【讨论】:

    • 谢谢,我确实找到了艺术,我听说我可以将 selenium 与 phpunit 集成,所以这是一个优雅的方式。
    猜你喜欢
    • 2013-09-16
    • 2012-04-24
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多