Я хотел бы знать, как писать тесты PHPUnit с Zend_Test и вообще с PHP.
Как использовать PHPUnit с Zend Framework?
Ответы (6)
Я использую 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');
}
}
Это все...
У них есть «Введение к искусству модульного тестирования" в Zend Developer Zone, посвященном PHPUnit.
Я нашел эту статью очень полезной. . Также очень помогла документация Zend_Test. С помощью этих двух ресурсов мне удалось успешно реализовать модульное тестирование в руководстве по быстрому запуску Zend Framework и написать для него несколько тестов.
Используя ZF 1.10, я поместил некоторый загрузочный код в тесты/bootstrap.php (в основном то, что находится в (public/index.php), до $application->bootstrap().
Затем я могу запустить тест, используя
phpunit --bootstrap ../bootstrap.php PersonControllerTest.php
Я не использовал Zend_Test, но написал тесты для приложений, использующих Zend_MVC и тому подобное. Самая большая часть — получить достаточно вашего кода начальной загрузки в вашей тестовой настройке.
Кроме того, если вы используете транзакцию базы данных, то было бы лучше удалить всю транзакцию, которая выполняется с помощью модульного теста, иначе ваша база данных будет запутана.
так что настрой
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);
}