4

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

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

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

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

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

4

2 回答 2

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

于 2011-09-22T19:31:34.187 回答
1

Rob Allen写了一篇关于使用 PHPUnit 测试 Zend 控制器动作的非常好的文章。这使用Zend_Test_PHPUnit_ControllerTestCase,它引导整个应用程序并测试响应。

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

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

于 2011-09-22T19:42:56.237 回答