2012-09-03 7 views
7

इसलिए जब भी मुझे PHPUnit में अप्रत्याशित अपवादों का सामना करना पड़ता है (जैसे कि अखंडता जांच के कारण डीबी में डालने में विफल रहता है) मेरे परीक्षण विफल हो जाते हैं और यह बिना चलने के त्रुटियों से बाहर हो जाता है tearDownAfterClass() फ़ंक्शन। यह मेरे डेटाबेस को गन्दा स्थिति में छोड़ देगा, इसलिए मुझे इसे मैन्युअल रूप से जाना और साफ़ करना होगा। क्या tearDownAfterClass() को हमेशा निष्पादित करने का कोई तरीका है?PHPUnit में अप्रत्याशित अपवादों के मामले में चलाने के लिए tearDownAfterClass() को मजबूर करने के लिए कैसे करें

उत्तर

5

PHPUnit भी tearDownAfterClass कॉल करेंगे। यह नहीं इसे कॉल करेगा जब setUpBeforeClass अपवाद फेंकता है। यह सुनिश्चित करने के लिए कि आपका डेटाबेस साफ़ हो गया है, क्लीनअप कोड को एक नई विधि में ले जाएं जिसे आप tearDownAfterClass से कॉल करते हैं और 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

धन्यवाद! यह वही है जो मैं खोज रहा था! –

2

आप समारोह

protected function onNotSuccessfulTest(Exception $e) 
उदाहरण के लिए साथ

ओवरराइड कर सकते हैं; जब वहाँ त्रुटियों और परीक्षण तरीकों में विफलताओं हैं

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

** चेतावनी: ** यह प्रत्येक टेस्ट विधि के लिए 'tearDownAfterClass' को कॉल करेगा जो त्रुटियों या त्रुटियों के लिए कॉल करेगा - एक बार पूरी कक्षा के अंत में नहीं। –

+0

-1 यह समस्या को हल नहीं करता है क्योंकि 'setUpBeforeClass' को अपवाद फेंकने पर 'ऑन नॉट असफलफस्ट'' नहीं कहा जाता है। –