2012-09-03 7 views
7

Tak więc za każdym razem, gdy napotykam nieoczekiwane wyjątki w PHPUnit (np. Nie można wstawić do db ze względu na kontrolę integralności) moje testy kończą się niepowodzeniem i są błędne bez uruchamiania Funkcja tearDownAfterClass(). Spowoduje to, że moja baza danych stanie się nieczytelna, więc muszę ręcznie ją wyczyścić. Czy istnieje sposób, aby zapewnić, że tearDownAfterClass() jest zawsze wykonywany?w PHPUnit jak zmusić tearDownAfterClass() do uruchomienia w przypadku nieoczekiwanych wyjątków

Odpowiedz

5

PHPUnit wezwie tearDownAfterClass nawet gdy istnieją błędy i niepowodzenia w metodach badawczych. Będzie to , a nie wywoływać, gdy setUpBeforeClass zgłasza wyjątek. Aby upewnić się, że baza danych została wyczyszczona, przenieś kod oczyszczający do nowej metody, którą wywołujesz z tearDownAfterClass i klauzuli catch w 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

Dziękujemy! właśnie tego szukałem! –

2

Można zastąpić funkcję

protected function onNotSuccessfulTest(Exception $e) 

z na przykład;

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

** Uwaga: ** Będzie to wywoływać 'tearDownAfterClass' dla każdej metody testowej, która ulegnie awarii lub błędom - ani razu na końcu dla całej klasy. –

+0

-1 To również nie rozwiązuje problemu, ponieważ 'onNotSuccessfulTest' nie jest wywoływany, gdy' setUpBeforeClass' zgłasza wyjątek. –

Powiązane problemy