2013-02-20 22 views
7

मैं क्यूटी सी ++ दुनिया में बता रहा हूं। मैं QTest कक्षा का उपयोग कर टीडीडी कर रहा हूं। मैं यह सत्यापित करना चाहता हूं कि कुछ स्थितियों में मेरी कक्षा द्वारा परीक्षण के तहत एक अपवाद फेंक दिया गया है। Google परीक्षण का उपयोग करके, मैं कुछ उपयोग करता हूं:QTest के साथ कैसे सत्यापित करें कि एक अपवाद फेंक दिया गया है?

EXPECT_THROW(A(NULL), nullPointerException); 

क्या यह QTest में इस सुविधा की तरह कुछ मौजूद है? हे कम से कम ऐसा करने का एक तरीका है?

धन्यवाद!

+1

क्यूटी दुनिया में अपवाद बहुत आम नहीं हैं। इसके लिए QTest में afaik कोई विशिष्ट मैक्रो नहीं है, लेकिन आप क्विकिफ़ी के साथ परीक्षण को ट्रैक करने का प्रयास कर सकते हैं। वैकल्पिक रूप से आप क्यूटी के साथ Google टेस्ट का भी उपयोग कर सकते हैं (जो कि कई कारणों से, qtest imho से काफी बेहतर है) – TWE

+0

हां, इस समय तक मैं महसूस कर रहा हूं कि gtest QTest से कहीं बेहतर है। धन्यवाद! – Killrazor

+0

इसके अलावा, gtest gmock का समर्थन करता है जबकि QTest के लिए ऐसा कुछ भी नहीं है। क्यूटेस्ट वास्तव में केवल आरामदायक उपयोग के लिए है, न कि अच्छे यूटी के लिए। QTest से आपको केवल एक चीज चाहिए, यदि आप gtest का उपयोग करते हैं, तो QSignalSpy है। Gtest में अन्य सभी चीजें बहुत बेहतर हैं। – ixSci

उत्तर

10

चूंकि Qt5.3 QTest एक मैक्रो QVERIFY_EXCEPTION_THROWN प्रदान करता है जो अनुपलब्ध सुविधा प्रदान करता है।

+0

इसके साथ एकमात्र समस्या यह है कि 'यदि प्रतिस्थापन योग्य प्रकार का अपवाद फेंक दिया गया है या अभिव्यक्ति बिल्कुल अपवाद नहीं फेंकती है, तो परीक्षण में विफलता दर्ज की जाएगी लॉग और परीक्षण आगे निष्पादित नहीं किया जाएगा। जिसका अर्थ यह है कि वास्तव में कोई आउट ऑफ़ द बॉक्स समाधान नहीं है जो आपको यह जांचने की अनुमति देता है कि ** ** ** निर्दिष्ट अपवाद प्रकार (या व्युत्पन्न) को फेंक नहीं देता है। – rbaleksandar

5

यह मैक्रो सिद्धांत का प्रदर्शन करता है।

typeid तुलना एक विशेष उपयोग केस है, इसलिए इसका उपयोग करना या नहीं हो सकता है - यह मैक्रो को परीक्षण में असफल होने की अनुमति देता है, भले ही फेंक दिया गया अपवाद उस व्यक्ति से लिया गया हो जिसे आप परीक्षण कर रहे हैं। अक्सर आप यह नहीं चाहते हैं, लेकिन मैंने इसे किसी भी तरह फेंक दिया!

#define EXPECT_THROW(func, exceptionClass) \ 
{ \ 
    bool caught = false; \ 
    try { \ 
     (func); \ 
    } catch (exceptionClass& e) { \ 
     if (typeid(e) == typeid(exceptionClass)) { \ 
      cout << "Caught" << endl; \ 
     } else { \ 
      cout << "Derived exception caught" << endl; \ 
     } \ 
     caught = true; \ 
    } catch (...) {} \ 
    if (!caught) { cout << "Nothing thrown" << endl; } \ 
}; 

void throwBad() 
{ 
    throw std::bad_exception(); 
} 

void throwNothing() 
{ 
} 

int main() { 
    EXPECT_THROW(throwBad(), std::bad_exception) 
    EXPECT_THROW(throwBad(), std::exception) 
    EXPECT_THROW(throwNothing(), std::exception) 

    return EXIT_SUCCESS; 
} 

रिटर्न:

Caught 
Derived exception caught 
Nothing thrown 

QTest के लिए अनुकूल करने के लिए आप एक QFAIL के साथ विफल के लिए मजबूर करने की आवश्यकता होगी।

+0

यदि आप std :: अपवाद से स्वतंत्र होने के लिए {typeid (e) == टाइपिड (अपवाद क्लास)) {'{कैच अपवाद क्लास और ई) {\ का उपयोग क्यों नहीं करते हैं? – ixSci

+0

क्योंकि अगर अपवाद 'अपवाद क्लास' से प्राप्त नहीं होता है या नहीं मिलता है तो 'कैच' ब्लॉक छोड़ा जाएगा। – cmannett85

+1

मैं देखता हूं, तो पकड़ने के लिए पर्याप्त है (...) और इसे एक अनचाहे – ixSci

संबंधित मुद्दे