2008-09-15 17 views

Respuesta

0

No he usado Zend_Test, pero he escrito pruebas contra aplicaciones que usan Zend_MVC y similares. La parte más importante es obtener suficiente código de arranque en la configuración de prueba.

14

Estoy usando Zend_Test para probar completamente todos los controladores. Es bastante simple de configurar, ya que solo tiene que configurar su archivo de arranque (¡el archivo de arranque en sí NO debe despachar el controlador frontal!). Mi base de clase de casos de prueba es el siguiente:

abstract class Controller_TestCase extends Zend_Test_PHPUnit_ControllerTestCase 
{ 
    protected function setUp() 
    { 
     $this->bootstrap=array($this, 'appBootstrap'); 
     Zend_Auth::getInstance()->setStorage(new Zend_Auth_Storage_NonPersistent()); 
     parent::setUp(); 
    } 

    protected function tearDown() 
    { 
     Zend_Auth::getInstance()->clearIdentity(); 
    } 

    protected function appBootstrap() 
    { 
     Application::setup(); 
    } 
} 

donde Application::setup(); hace todo el trabajo de instalación hasta que también configurar la aplicación real. Una prueba simple entonces se vería así:

class Controller_IndexControllerTest extends Controller_TestCase 
{ 
    public function testShowist() 
    { 
     $this->dispatch('/'); 
     $this->assertController('index'); 
     $this->assertAction('list'); 
     $this->assertQueryContentContains('ul li a', 'Test String'); 
    } 
} 

Eso es todo ...

+0

Nos puedes contar un poco más sobre esto? ¡Me gusta tu clase abstracta de TestCase! ¿Dónde colocas tu Controller_TestCase? ¿Necesita solicitar/incluir algún archivo? ¿Cómo se hace una prueba? ¿Usas PHPUnit a través de la línea de comando o con un complemento en un IDE? ¡Gracias! – Andrew

+3

Puse Controller_TestCase en mi directorio de pruebas/controlador - ese es el directorio donde se encuentran todos los casos de prueba del controlador. En general, no utilizo la carga automática al ejecutar pruebas unitarias, pero si realizo pruebas de controlador, uso Zend_Loader :: registerAutoload() para usar la carga automática porque es muy ... –

+2

... difícil de rastrear las dependencias con el MVC en ejecución. Solo tiene que asegurarse de seguir la convención de nomenclatura y que Zend_Loader encontrará sus archivos (set include_path). Para ejecutar mis pruebas, utilizo la CLI de PHPUnit porque no me gusta la integración de PHPUnit en Eclipse PDT. Es ... –

2

Encontré this artículo muy útil. También la documentación Zend_Test ayudó mucho. Con la ayuda de estos dos recursos, logré implementar con éxito las pruebas unitarias en el QuickStart tutorial de Zend Framework y escribir algunas pruebas para ello.

1

Usando ZF 1.10, que poner un poco de código de arranque en pruebas/Bootstrap.php (básicamente lo que está en (público/index.php), hasta $ aplicación-> bootstrap().

entonces soy capaz de ejecutar una prueba utilizando

phpunit --bootstrap ../bootstrap.php PersonControllerTest.php 
0

Además, si el uso de una transacción de base de datos, entonces sería mejor eliminar toda la transacción que se consigue hecho a través de una unidad de prueba de lo contrario su base de datos se lleva todos en mal estado.

modo en el set hasta

public function setUp() { 



    YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(true); 



    YOUR_ZEND_DB_INSTANCE::getInstance()->query("BEGIN"); 

    YOUR_ZEND_DB_INSTANCE::getInstance()->getCache()->clear(); 

    // Manually Start a Doctrine Transaction so we can roll it back 
    Doctrine_Manager::connection()->beginTransaction(); 
} 

y desmontaje de todo lo que tiene que hacer es rollback

public function tearDown() { 



    // Rollback Doctrine Transactions 
    while (Doctrine_Manager::connection()->getTransactionLevel() > 0) { 
     Doctrine_Manager::connection()->rollback(); 
    } 

    Doctrine_Manager::connection()->clear(); 



    YOUR_ZEND_DB_INSTANCE::getInstance()->query("ROLLBACK"); 
    while (YOUR_ZEND_DB_INSTANCE::getInstance()->getTransactionDepth() > 0) { 
     YOUR_ZEND_DB_INSTANCE::getInstance()->rollback(); 
    } 
    YOUR_ZEND_DB_INSTANCE::getInstance()->setUnitTestMode(false); 

} 
Cuestiones relacionadas