Frage

Hat jemand keinen Erfolg hatte Zend_Test einrichten? Was war Ihre Methode / Ansatz und wie führen Sie Ihre Tests / Test-Suiten?

Ich habe PHPUnit bereits installiert und arbeiten. Jetzt versuche ich, ein paar einfachen Controller-Tests zu schreiben. Die Zend Framework-Dokumentation geht davon aus, dass die automatischen Laden von Setup, das ich nicht getan hätte. Welche Methode Sie Sie Verwendung automatisch zu laden die entsprechenden Dateien? Ich tue dies in meiner normalen Bootstrap-Datei, aber ich will nicht beinhaltet meinen Test mit einem Bündel zu vollstopfen und Pfaden einrichten. Würde eine abstrakte Controller Testfall Klasse der Weg zu gehen?

Was ist mit dem Bootstrap-Plugin wie die Dokumentation verwendet ... ist, dass, wie Sie Ihre Tests Bootstrap, oder haben Sie es eine andere Art und Weise zu tun? Ich möchte so viel von der regulären Bootstrap-Datei, wie ich kann wiederverwendet werden. Wie soll ich meine DRY Bootstrap zum Testen und normale Nutzung?

Hier ist mein Test so weit:

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

Was soll ich tun?

War es hilfreich?

Lösung

Hier ist, was ich getan habe, um es zu arbeiten:

Zuerst müssen wir das automatische Laden von Problem zu lösen. Wir werden dies tun, indem Sie eine Datei erstellen, die alle Tests umfassen wird, und es in den Tests Verzeichnis. Hinweis:. Ich habe so ziemlich alles aus meinem /public/index.php kopiert

# /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();

Zweitens müssen wir diese Datei in unserem Test aufzunehmen. Unsere Testdatei ist in / Tests / application / controllers /. Ich werde nicht meine Bootstrap als Plugin verwenden, da meine Bootstrap-Datei auf die gleiche Weise wie die Quickstart Tutorial . Ich werde einfach verknüpfen, indem der Ort als public $ Bootstrap Einstellung. Wenn Zend_Test_PHPUnit_ControllerTestCase Konstrukte, wird es aussehen für die Bootstrap-Datei, die wir hier gesetzt.

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

}

Und das ist es! Wenn meine Bootstrap-Datei war bereits ein Plugin, könnte dies ein wenig komplizierter, aber da es nicht, es ist super einfach.

Andere Tipps

Anstelle von

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

ändern Sie es in

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

register () als von 1.8.0 als veraltet

Ich benutze immer eine einfache TestHelper.php, die einige grundlegende Initialisierung Sachen tut. Diese Datei wird in jeder Testfall-Datei enthalten. Eines der Dinge, die ich tue, ist das Registrieren des Zend Framework Autoloader, wie ich besonders große Abhängigkeitsprobleme erlebt, wenn Filter, Validierer und Formulare. Es ist fast unmöglich, den Überblick über alle benötigten Dateien zu halten und schließen sie manuell in den Testfällen.

Sie können vielleicht die automatische Laden Initialisierung und das Setup der Include-Pfade in Ihre Bootstrap-Plugin wie dieses Verfahren bewegen sollen das gleiche für die reale Anwendung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top