我想知道如何用Zend_Test编写PHPUnit测试,一般用PHP编写。
答案 0 :(得分:14)
我正在使用Zend_Test来完全测试所有控制器。设置起来非常简单,因为您只需要设置引导程序文件(引导文件本身不应该调度前端控制器!)。我的基本测试用例类如下所示:
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();
执行所有设置真实应用程序的设置任务。然后一个简单的测试看起来像这样:
class Controller_IndexControllerTest extends Controller_TestCase
{
public function testShowist()
{
$this->dispatch('/');
$this->assertController('index');
$this->assertAction('list');
$this->assertQueryContentContains('ul li a', 'Test String');
}
}
这就是......
答案 1 :(得分:7)
他们在Zend Developer Zone上有一个“Introduction to the Art of Unit Testing”,它涵盖了PHPUnit。
答案 2 :(得分:2)
我发现this文章非常有用。另外Zend_Test文档也有很多帮助。 在这两个资源的帮助下,我成功地在Zend Framework的QuickStart tutorial中实现了单元测试,并为它编写了一些测试。
答案 3 :(得分:1)
使用ZF 1.10,我将一些引导代码放入tests / bootstrap.php(基本上是(public / index.php)中的内容,直到$ application-> bootstrap()。
然后我可以使用
运行测试phpunit --bootstrap ../bootstrap.php PersonControllerTest.php
答案 4 :(得分:0)
我没有使用过Zend_Test,但我已经使用Zend_MVC等编写了针对应用程序的测试。最重要的是在测试设置中获得足够的引导代码。
答案 5 :(得分:0)
另外,如果您使用数据库事务,那么最好删除通过单元测试完成的所有事务,否则您的数据库将全部搞乱。
所以设置
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);
}