Pergunta

Alguém já teve algum sucesso a criação de Zend_Test? Qual foi o seu método / abordagem e como você executar os testes / suites de teste?

Já tenho PHPUnit instalado e funcionando. Agora eu estou tentando escrever alguns testes simples controlador. A documentação do Zend Framework assume que autoloading é de configuração, que eu não fiz. Que método você uso para autoLoad os arquivos apropriados? Faço-o no meu arquivo de inicialização normal, mas eu não quero sobrecarregar o meu teste com um monte de inclui e criação de caminhos. Será que uma classe de caso de teste controlador abstract ser o caminho a percorrer?

O que sobre o plugin de inicialização como os usos de documentação ... é que como você inicializar seus testes, ou você gosta de fazê-lo de maneira diferente? Eu gostaria de re-uso, tanto do arquivo de inicialização regular como eu posso. Como devo secar meu inicialização para testar e uso normal?

Aqui está o meu teste até agora:

<?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...
}

O que devo fazer?

Foi útil?

Solução

Aqui está o que eu fiz para fazê-lo funcionar:

Em primeiro lugar, precisamos resolver o problema autoloading. Nós vamos fazer isso criando um arquivo que todos os testes incluirão, e colocá-lo no diretório de testes. Nota:. Eu praticamente copiou tudo isso do meu /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();

Em segundo lugar, precisamos incluir esse arquivo em nosso teste. Nosso arquivo de teste está em / tests / aplicativo / controladores /. Eu não vou usar o meu inicialização como um plug-in desde o meu arquivo de inicialização funciona da mesma maneira como o QuickStart tutorial . Eu vou ligar para ele, definindo o local como o $ de bootstrap público. Quando construções Zend_Test_PHPUnit_ControllerTestCase, ele vai olhar para o arquivo de inicialização que estabelecemos aqui.

<?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');
    }

}

E é isso! Se o meu arquivo de inicialização já foi um plugin, isso pode ser um pouco mais complicado, mas uma vez que não é, é super fácil.

Outras dicas

Em vez de usar

require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

transformá-lo em

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

registerAutoload () é obsoleto a partir do 1.8.0

Eu sempre uso um simples TestHelper.php que faz algumas coisas básicas de inicialização. Este arquivo está incluído em cada arquivo de teste caso. Uma das coisas que eu faço, é registrar o autoloader do Zend Framework como eu experimentei principais problemas de dependência, especialmente quando usando filtros, validadores e formas. É quase impossível manter o controle de todos os arquivos necessários e incluí-los manualmente nos estudos de casos.

Você pode, talvez mover a inicialização carregamento automático ea configuração do incluir caminhos em sua bootstrapping plugin como este procedimento deve ser o mesmo para a aplicação real.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top