我如何使用PHPUnit和Zend Framework?

我想知道如何用Zend_Test编写PHPUnittesting,一般用PHP编写。

我正在使用Zend_Test来完全testing所有的控制器。 设置起来相当简单,因为你只需要设置引导文件(引导文件本身不应该派发前端控制器!)。 我的基础testing用例类如下所示:

abstract class Controller_TestCase extends Zend_Test_PHPUnit_ControllerTestCase { protected function setUp() { $this->bootstrap=array($this, 'appBootstrap'); Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_NonPersistent()); parent::setUp(); } protected function tearDown() { Zend_Auth::getInstance()->clearIdentity(); } protected function appBootstrap() { Application::setup(); } } 

Application::setup(); 做所有的设置任务也build立了真正的应用程序。 然后,一个简单的testing将如下所示:

 class Controller_IndexControllerTest extends Controller_TestCase { public function testShowist() { $this->dispatch('/'); $this->assertController('index'); $this->assertAction('list'); $this->assertQueryContentContains('ul li a', 'Test String'); } } 

就这样…

他们在Zend Developer Zone上有一个“ unit testing的艺术介绍 ”,它涵盖了PHPUnit。

我发现这篇文章非常有用。 另外Zend_Test文档也帮了很多忙。 在这两个资源的帮助下,我成功地在Zend Framework的QuickStart教程中实现了unit testing,并为它写了一些testing。

使用ZF 1.10,我在test / bootstrap.php(基本上是(public / index.php)中join了一些引导代码,直到$ application-> bootstrap()。

然后我可以运行testing使用

 phpunit --bootstrap ../bootstrap.php PersonControllerTest.php 

我没有使用Zend_Test,但是我已经使用Zend_MVC等编写了testing应用程序。 最大的部分是在testing设置中获得足够的引导程序代码。

另外,如果你使用数据库事务,那么最好是删除所有通过unit testing完成的事务,否则你的数据库会被搞乱。

如此设置

 public function setUp() { YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(true); YOUR_ZEND_DB_INSTANCE::getInstance()->query("BEGIN"); YOUR_ZEND_DB_INSTANCE::getInstance()->getCache()->clear(); // Manually Start a Doctrine Transaction so we can roll it back Doctrine_Manager::connection()->beginTransaction(); } 

并在拆除所有你需要做的是回滚

 public function tearDown() { // Rollback Doctrine Transactions while (Doctrine_Manager::connection()->getTransactionLevel() > 0) { Doctrine_Manager::connection()->rollback(); } Doctrine_Manager::connection()->clear(); YOUR_ZEND_DB_INSTANCE::getInstance()->query("ROLLBACK"); while (YOUR_ZEND_DB_INSTANCE::getInstance()->getTransactionDepth() > 0) { YOUR_ZEND_DB_INSTANCE::getInstance()->rollback(); } YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(false); }