2012-09-03 7 views
7

Así que cada vez que encuentro excepciones inesperadas en PHPUnit (como no se puede insertar en db debido a una verificación de integridad) mis pruebas fallan y se produce un error sin ejecutar tearDownAfterClass() función. Esto dejará mi base de datos en un estado desordenado, así que tengo que ir y limpiarla manualmente. ¿Hay alguna forma de garantizar que tearDownAfterClass() siempre se ejecute?en PHPUnit cómo forzar que tearDownAfterClass() se ejecute en caso de excepciones inesperadas

Respuesta

5

PHPUnit llamará tearDownAfterClass incluso cuando hay errores y fallos en los métodos de ensayo. Será no llámelo cuando setUpBeforeClass arroja una excepción. Para asegurarse de que su base de datos esté limpia, mueva el código de limpieza a un nuevo método al que llame desde tearDownAfterClass y la cláusula catch en setUpBeforeClass.

function FooTest extends PHPUnit_Framework_TestCase 
{ 
    static function setUpBeforeClass() { 
     try { 
      ... setup code that might fail ... 
     } 
     catch (Exception $e) { 
      self::cleanupDatabase(); 
      throw $e; // so the tests will be skipped 
     } 
    } 

    static function tearDownAfterClass() { 
     self::cleanupDatabase(); 
    } 

    static function cleanupDatabase() { 
     ... clean ... 
    } 

    ... test methods ... 
} 
+0

¡Gracias! eso es exactamente lo que estaba buscando! –

2

Puede anular la función

protected function onNotSuccessfulTest(Exception $e) 

con, por ejemplo;

$this->tearDownAfterClass(); 
throw $e; 
+2

** Advertencia: ** Esto llamará a 'tearDownAfterClass' para cada método de prueba que falle o errores, no una vez al final de toda la clase. –

+0

-1 Tampoco resuelve el problema porque 'onNotSuccessfulTest' no se invoca cuando' setUpBeforeClass' arroja una excepción. –

Cuestiones relacionadas