Zend Framework: Начало работы с Zend_Test
-
19-08-2019 - |
Вопрос
У кого-нибудь был успех в настройке Zend_Test? Каков был ваш метод / подход и как вы выполняете свои тесты / наборы тестов?
У меня уже установлен и работает PHPUnit. Сейчас я пытаюсь написать несколько простых тестов контроллера. В документации Zend Framework предполагается, что автозагрузка настроена, чего я не делал. Какой метод вы используете для автозагрузки соответствующих файлов? Я делаю это в моем обычном файле начальной загрузки, но я не хочу загромождать свой тест кучей включений и настройкой путей. Будет ли уместен класс тестовых примеров абстрактного контроллера?
А как насчет плагина начальной загрузки, который используется в документации ... это то, как вы загружаете свои тесты, или вам нравится делать это по-другому? Я хотел бы повторно использовать как можно больше обычного файла начальной загрузки. Как мне высушить загрузчик для тестирования и нормального использования?
Вот мой тест на данный момент:
<?php
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public function setUp()
{
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp();
}
public function appBootstrap()
{
$this->frontController->registerPlugin(new Bootstrapper('testing'));
}
public function testIndexAction()
{
$this->dispatch('/index');
$this->assertController('index');
$this->assertAction('index');
}
}
//straight from the documentation
class Bootstrapper extends Zend_Controller_Plugin_Abstract
{
/**
* @var Zend_Config
*/
protected static $_config;
/**
* @var string Current environment
*/
protected $_env;
/**
* @var Zend_Controller_Front
*/
protected $_front;
/**
* @var string Path to application root
*/
protected $_root;
/**
* Constructor
*
* Initialize environment, root path, and configuration.
*
* @param string $env
* @param string|null $root
* @return void
*/
public function __construct($env, $root = null)
{
$this->_setEnv($env);
if (null === $root) {
$root = realpath(dirname(__FILE__) . '/../../../');
}
$this->_root = $root;
$this->initPhpConfig();
$this->_front = Zend_Controller_Front::getInstance();
}
/**
* Route startup
*
* @return void
*/
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$this->initDb();
$this->initHelpers();
$this->initView();
$this->initPlugins();
$this->initRoutes();
$this->initControllers();
}
// definition of methods would follow...
}
Что мне делать?
Решение
Вот что я сделал, чтобы заставить его работать:
Сначала нам нужно решить проблему с автозагрузкой. Мы сделаем это, создав файл, который будут включены во все тесты, и поместим его в каталог tests. Примечание. Я скопировал все это из моего /public/index.php.
# /tests/loader.php
<?php
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application/'));
set_include_path( APPLICATION_PATH . '/../library' . PATH_SEPARATOR .
APPLICATION_PATH . '/models' . PATH_SEPARATOR .
APPLICATION_PATH . '/forms' . PATH_SEPARATOR .
get_include_path() );
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();
Во-вторых, нам нужно включить этот файл в наш тест. Наш тестовый файл находится в / tests / application / controllers /. Я не собираюсь использовать мой загрузчик в качестве плагина, так как мой файл начальной загрузки работает так же, как Краткое руководство по началу работы . Я просто сошлюсь на него, установив местоположение как публичный загрузчик $. Когда Zend_Test_PHPUnit_ControllerTestCase
создаст, он будет искать файл начальной загрузки, который мы здесь установили.
<?php
require_once '../../loader.php';
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
public $bootstrap = '../../../application/bootstrap.php';
public function testIndexAction()
{
$this->dispatch('/index');
$this->assertController('index');
$this->assertAction('index');
}
}
И это все! Если мой файл начальной загрузки уже был плагином, это может быть немного сложнее, но, поскольку это не так, это очень просто.
Другие советы
Вместо использования
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();
измените его на
require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();
registerAutoLoad () устарела с версии 1.8.0
Я всегда использую простой TestHelper.php, который выполняет некоторые базовые функции инициализации. Этот файл включен в каждый файл теста. Одна из вещей, которые я делаю, - это регистрация автозагрузчика Zend Framework, поскольку у меня возникли серьезные проблемы с зависимостями, особенно при использовании фильтров, валидаторов и форм. Почти невозможно отследить все необходимые файлы и вручную включить их в тест-кейсы.
Возможно, вы можете переместить инициализацию автозагрузки и настройку путей включения в свой плагин начальной загрузки, поскольку эта процедура должна быть такой же для реального приложения.