Вопрос

У кого-нибудь был успех в настройке 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, поскольку у меня возникли серьезные проблемы с зависимостями, особенно при использовании фильтров, валидаторов и форм. Почти невозможно отследить все необходимые файлы и вручную включить их в тест-кейсы.

Возможно, вы можете переместить инициализацию автозагрузки и настройку путей включения в свой плагин начальной загрузки, поскольку эта процедура должна быть такой же для реального приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top