2009-03-17 4 views
4

Hat jemand Erfolg beim Einrichten von Zend_Test gehabt? Was war Ihre Methode/Vorgehensweise und wie führen Sie Ihre Tests/Testsuiten durch?Zend Framework: Erste Schritte mit Zend_Test

Ich habe bereits PHPUnit installiert und funktioniert. Jetzt versuche ich ein paar einfache Controller-Tests zu schreiben. Die Zend Framework-Dokumentation geht davon aus, dass Autoloading eingerichtet ist, was ich nicht getan habe. Welche Methode verwenden Sie verwenden, um die entsprechenden Dateien automatisch zu laden? Ich mache das in meiner normalen Bootstrap-Datei, aber ich möchte meinen Test nicht mit einer Reihe von Includes und Verbindungswegen überladen. Wäre eine abstrakte Controller-Testfallklasse der richtige Weg?

Was ist mit dem Bootstrap-Plugin wie die Dokumentation verwendet ... ist das, wie Sie Ihre Tests booten, oder möchten Sie es anders machen? Ich möchte so viel wie möglich von der normalen Bootstrap-Datei verwenden. Wie sollte ich meinen Bootstrap zum Testen und normalen Gebrauch DRY?

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?

Antwort

3

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

Zuerst müssen wir das automatische Laden von Problem zu lösen. Dazu erstellen wir eine Datei, die alle Tests enthalten, und legen sie im Testverzeichnis ab. Hinweis: Ich habe das alles aus meiner /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 unseren Test aufnehmen. Unsere Testdatei befindet sich in/tests/application/controllers /. Ich werde meinen Bootstrap nicht als Plugin verwenden, da meine Bootstrap-Datei genauso funktioniert wie die QuickStart tutorial. Ich verlinke einfach darauf, indem ich den Ort als public $ bootstrap festlege. Wenn Zend_Test_PHPUnit_ControllerTestCase erstellt wird, sucht es nach der Bootstrap-Datei, die wir hier festgelegt haben.

<?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 war's! Wenn meine Bootstrap-Datei bereits ein Plugin wäre, könnte das ein wenig komplizierter sein, aber da es nicht ist, ist es super einfach.

0

Ich benutze immer eine einfache TestHelper.php, die einige grundlegende Initialisierung Sachen tut. Diese Datei ist in jeder Testfalldatei enthalten. Eines der Dinge, die ich mache, ist die Registrierung des Zend Framework Autoloaders, da ich große Abhängigkeitsprobleme hatte, besonders bei der Verwendung von Filtern, Validatoren und Formularen. Es ist nahezu unmöglich, alle erforderlichen Dateien zu verfolgen und sie manuell in die Testfälle aufzunehmen.

Sie können vielleicht die Autoloading-Initialisierung und das Setup der Include-Pfade in Ihr Bootstrapping-Plugin verschieben, da diese Prozedur für die reale Anwendung identisch sein sollte.

1

Statt des Verwendens

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

Veränderung sie in

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

register() ist veraltet ab 1.8.0