2010-11-11 15 views
6

मेरे पास परीक्षण का एक सेट है, और मैं परीक्षण करना चाहता हूं कि मेरी कक्षाएं सही समय पर अपवाद फेंक दें। उदाहरण में, मेरी कक्षा __get() जादू विधि का उपयोग करता है, इसलिए मैं परीक्षण करने के लिए है कि एक अपवाद जब गलत संपत्ति लिया गया है फेंक दिया जाता है की जरूरत है:PHPUnit अपेक्षित अपवाद नहीं पकड़ता

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

वर्ग के रूप में यह होना चाहिए एक त्रुटि फेंकता है, लेकिन इसके बजाय का बस पास हो रहा है, अपवाद पकड़ा नहीं गया है!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

मैं पहले SimpleTest का उपयोग कर रहा था, और $this->expectException(new Exception("Property qwerty does not exist")); बस ठीक काम किया। मुझे पता है कि अन्य विधियां हैं (@expectedException और try-catch), लेकिन यह काम करना चाहिए और यह बहुत साफ दिखता है। कोई विचार है कि मैं यह काम कैसे कर सकता हूं?

उत्तर

13

यह अपवाद में पाठ की तलाश में नहीं है, यह अपवाद वर्ग के नाम की तलाश में है ... Docs

$this->setExpectedException('Exception'); 

यह काफी आसान है जब आप SPL Exceptions कस्टम अपवाद कक्षाओं का उपयोग कर रहे हैं, या .. ।

+0

धन्यवाद! मैंने पूरी तरह से अनदेखा किया क्योंकि मुझे इसे करने के सरलतम तरीके से उपयोग किया गया था। क्या आपको पता है कि पाठ के लिए परीक्षण करने का कोई आसान तरीका है? –

+0

@ नाथन, @ircmaxell: मेरा जवाब देखें, टेक्स्ट के परीक्षण सहित, ऐसा करने का एक बेहतर तरीका है। – ryeguy

+0

@ircmaxell: मैं इस मामले से असहमत हूं कि इससे कोई फर्क नहीं पड़ता। आप किसी भी अच्छी तरह से डिज़ाइन की गई भाषा या ढांचे को नहीं देखते हैं जो पॉप अप होने वाली हर नई त्रुटि के लिए एक नया अपवाद बनाते हैं। यह बहुत अधिक काम होगा। – ryeguy

13

ircmaxell के जवाब देने के लिए जोड़ा जा रहा है, वहाँ वास्तव में ऐसा करने का एक सरल तरीका है:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

@expectedException उम्मीद के अपवाद का वर्ग नाम, और @expectedExceptionMessage अपवाद संदेश की एक सबस्ट्रिंग अपेक्षा करने के लिए है (यह सही है, आपके पास पूरा संदेश नहीं है)।

यदि आप डॉकब्लॉक एनोटेशन का उपयोग नहीं करना चाहते हैं, तो ये दोनों वास्तव में परीक्षण मामले पर विधियों के रूप में उपलब्ध हैं।

+4

+1 ... मुझे 'exexExceptionMessage के बारे में पता नहीं था 'docblock तत्व ... हर दिन कुछ नया सीखें ... – ircmaxell

+0

@ircmaxell: हाँ, मैंने अभी इसे थोड़ा सा पहले खोज लिया है। "एनोटेशन" परिशिष्ट के तहत कहीं भी इसका कोई उल्लेख नहीं है। फिर भी, इसमें कोई दस्तावेज़ नहीं है, यह सिर्फ इसका नाम सूचीबद्ध करता है। – ryeguy

+0

बहुत अच्छा - धन्यवाद! – jmadsen