2009-08-13 10 views
19

मैं इस परीक्षण को चलाने के लिए कोशिश कर रहा हूँ: self.assertRaises(AttributeError, branch[0].childrennodes), और branch[0] एक विशेषता childrennodes नहीं है, इसलिए यह एक AttributeError, जो assertRaises पकड़ने चाहिए फेंक दिया जाना चाहिए, लेकिन जब मैं परीक्षण चलाने, परीक्षण विफल रहता है, क्योंकि यह है AttributeError फेंकना।क्यों जोर नहीं दिया गया है Python unittest का उपयोग कर मेरी विशेषता त्रुटि को पकड़ना?

Traceback (most recent call last): 
    File "/home/tttt/../tttt/tests.py", line 504, in test_get_categories_branch 
    self.assertRaises(AttributeError, branch[0].children_nodes) 
AttributeError: 'Category' object has no attribute 'children_nodes' 

कोई विचार?

उत्तर

19

मुझे लगता है क्योंकि यह जोर देता है कि केवल कॉल करने योग्य ही स्वीकार करता है। यह देखने के लिए evalutes कि कॉल करने योग्य अपवाद उठाता है, न कि अगर कथन स्वयं करता है।

self.assertRaises(AttributeError, getattr, branch[0], "childrennodes") 

काम करना चाहिए।

संपादित करें:

THC4k सही ढंग से कहते हैं यह संग्रहण समय के दौरान बयान एकत्रित करता है फिर त्रुटि जाएगा, परीक्षण समय पर नहीं।

यह भी एक कारण है कि मुझे नाक पसंद है, इसमें एक सजावटी (उठाता है) जो इस तरह के परीक्षणों के लिए उपयोगी और स्पष्ट है।

@raises(AttributeError) 
def test_1(self) 
    branch[0].childrennodes 
+2

सही समाधान यही है, लेकिन अपवाद तब होता है जब पायथन 'self.assertRaises' के लिए तर्क एकत्र करता है। इसे फ़ंक्शन को कॉल करने से पहले 'शाखा [0] .childrennodes' का मूल्यांकन करना होगा, जो अपेक्षा के अनुसार एक अपवाद उठाता है। –

+0

unittest में भी इसी तरह की विशेषताएं हैं। मैंने उन्हें अपने उत्तर में वर्णित किया है। हग्स! –

48

जब परीक्षण चल रहा है, self.assertRaises कॉल करने से पहले, अजगर सब विधि के तर्कों का मूल्य खोजने के लिए की जरूरत है। ऐसा करने में, यह branch[0].children_nodes का मूल्यांकन करता है, जो एक विशेषता त्रुटि उठाता है। चूंकि हमने अभी तक assertRaises का आह्वान नहीं किया है, इसलिए यह अपवाद नहीं पकड़ा गया है, जिससे परीक्षण विफल हो गया है।

self.assertRaises(AttributeError, lambda: branch[0].children_nodes) 

assertRaises भी एक संदर्भ प्रबंधक (अजगर 2.7 के बाद से, या PyPI पैकेज 'unittest2' में) के रूप में इस्तेमाल किया जा सकता:

समाधान एक समारोह में branch[0].children_nodes या एक लैम्ब्डा रैप करने के लिए है

with self.assertRaises(AttributeError): 
    branch[0].children_nodes 
    # etc 

यह अच्छा है क्योंकि इसे कोड के ब्लॉक को परिभाषित करने के लिए केवल एक नया फ़ंक्शन बनाने के बजाय, परीक्षण के बीच में कोड के मनमानी ब्लॉक पर उपयोग किया जा सकता है।

with self.assertRaises(AttributeError) as cm: 
    branch[0].children_nodes 

self.assertEquals(cm.exception.special_attribute, 123) 
+3

लैम्ब्डा सुपर सुरुचिपूर्ण है, इसे पोस्ट करने के लिए धन्यवाद :) –

1

pytest भी इसी तरह के डेकोरेटर है:

यह आप आगे की प्रक्रिया के लिए उठाया अपवाद के लिए पहुँच, यदि आवश्यक हो तो दे सकते हैं

from pytest import raises 

def test_raising(): 
    with raises(AttributeError): 
     branch[0].childrennodes 
संबंधित मुद्दे