2008-09-17 16 views
20

मेरे पास एक वर्ग है:मैं इकाई को assthRaises() के साथ एक अजगर वर्ग की __init __() विधि का परीक्षण कैसे करूं?

class MyClass: 
def __init__(self, foo): 
    if foo != 1: 
     raise Error("foo is not equal to 1!") 

और एक यूनिट परीक्षण जो यह सुनिश्चित करने के लिए किया जाता है कि कन्स्ट्रक्टर को गलत तर्क सही ढंग से एक त्रुटि उठाता है:

def testInsufficientArgs(self): 
    foo = 0 
    self.assertRaises((Error), myClass = MyClass(Error, foo)) 

लेकिन मुझे मिलता है ...

NameError: global name 'Error' is not defined 

क्यों? मुझे इस त्रुटि ऑब्जेक्ट को कहां परिभाषित किया जाना चाहिए? मैंने सोचा कि यह एक डिफ़ॉल्ट अपवाद प्रकार के रूप में अंतर्निहित था, नहीं?

उत्तर

20

इस उदाहरण में 'त्रुटि' कोई अपवाद वस्तु हो सकती है। मुझे लगता है कि शायद आपने एक कोड उदाहरण पढ़ा है जो इसे मेटासिंटाटिक प्लेसहोल्डर के रूप में इस्तेमाल करता है, जिसका अर्थ है "उपयुक्त अपवाद वर्ग"।

सभी अपवादों के बेसक्लास को 'अपवाद' कहा जाता है, और इसके अधिकांश उप-वर्गों में 'ओएसईआरर', 'वैल्यूएरर', 'नेमएरर', 'टाइप एरर' जैसे त्रुटि के प्रकार के वर्णनात्मक नाम हैं।

इस मामले में, उचित त्रुटि 'ValueError' है (foo का मान गलत था, इसलिए एक ValueError)। मैं आपकी स्क्रिप्ट में 'ValueError' के साथ 'त्रुटि' को बदलने की अनुशंसा करता हूं।

यहां कोड का एक पूरा संस्करण है जिसे आप लिखने की कोशिश कर रहे हैं, मैं सब कुछ डुप्लिकेट कर रहा हूं क्योंकि आपके मूल उदाहरण में एक अजीब कीवर्ड तर्क है कि आप एक असाइनमेंट के साथ उलझन में प्रतीत होते हैं, और मैं इसका उपयोग कर रहा हूं 'failUnless' समारोह नाम क्योंकि उस समारोह के गैर aliased नाम है:

class MyClass: 
    def __init__(self, foo): 
     if foo != 1: 
      raise ValueError("foo is not equal to 1!") 

import unittest 
class TestFoo(unittest.TestCase): 
    def testInsufficientArgs(self): 
     foo = 0 
     self.failUnlessRaises(ValueError, MyClass, foo) 

if __name__ == '__main__': 
    unittest.main() 

उत्पादन होता है:

. 
---------------------------------------------------------------------- 
Ran 1 test in 0.007s 

OK 

वहाँ इकाई परीक्षण पुस्तकालय 'unittest' है कि अन्य इकाई परीक्षण में एक दोष है ढांचे तय करें। आप ध्यान दें कि कॉलिंग संदर्भ से अपवाद ऑब्जेक्ट तक पहुंच प्राप्त करना असंभव है। आप इसे ठीक करना चाहते हैं, तो आप unittest का एक उपवर्ग में उस विधि को फिर से परिभाषित करना होगा:

इस प्रयोग में इसके बारे में एक उदाहरण है:

class TestFoo(unittest.TestCase): 
    def failUnlessRaises(self, excClass, callableObj, *args, **kwargs): 
     try: 
      callableObj(*args, **kwargs) 
     except excClass, excObj: 
      return excObj # Actually return the exception object 
     else: 
      if hasattr(excClass,'__name__'): excName = excClass.__name__ 
      else: excName = str(excClass) 
      raise self.failureException, "%s not raised" % excName 

    def testInsufficientArgs(self): 
     foo = 0 
     excObj = self.failUnlessRaises(ValueError, MyClass, foo) 
     self.failUnlessEqual(excObj[0], 'foo is not equal to 1!') 

मैं unittest से failUnlessRaises समारोह की नकल की है। python2.5 से py और इसे थोड़ा संशोधित किया।

+0

है जहां आप यह गलत हो गया था, यहाँ क्या आप के बजाय चाहता था, और यहाँ कोड है आप लिखने का इरादा है। यह शायद सबसे अच्छा जवाब है जिसे मैंने कभी देखा है। – LoveMeSomeCode

+2

self.failUnlessRaises अब बहिष्कृत है। इसके बजाय self.assertRaises का उपयोग करें। https://docs.python.org/2/library/unittest.html#deprecated-aliases – dghubble

+0

@LoveMeSomeCode '__init__' फ़ंक्शंस आमतौर पर किसी भी मान को वापस नहीं करते हैं। सामान्य 'unittests' मैं कार्यों के लिए देखता हूं, एक फ़ंक्शन द्वारा लौटाए गए मानों का परीक्षण करता हूं। क्या यह आमतौर पर आपके '__init__' कार्यों का परीक्षण करने की अनुशंसा करता है? यदि ऐसा है तो क्या आप '__init__' फ़ंक्शन के अंदर बदल गए मान का निरीक्षण करते हैं,' __init__' से संबंधित वर्ग के उदाहरण विशेषताओं तक सीधे पहुंच कर? –

1

मुझे लगता है कि आप Exception एस के बारे में सोच रहे हैं। अपवाद के साथ अपने विवरण में शब्द त्रुटि बदलें और आप :-)

5

जाना अच्छा होना चाहिए कैसे इस बारे में:

class MyClass: 
    def __init__(self, foo): 
     if foo != 1: 
      raise Exception("foo is not equal to 1!") 

import unittest 

class Tests(unittest.TestCase): 
    def testSufficientArgs(self): 
     foo = 1 
     MyClass(foo) 

    def testInsufficientArgs(self): 
     foo = 2 
     self.assertRaises(Exception, MyClass, foo) 

if __name__ == '__main__': 
    unittest.main() 
यहाँ
+1

आप शीर्ष पर अपवाद के उप-वर्ग के रूप में 'कक्षा त्रुटि' को परिभाषित कर सकते हैं और यदि आप चाहें तो इस उदाहरण में अपवाद के बजाय इसका उपयोग करें। – Terhorst

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