2010-06-18 11 views
6

sagen, dass ich die Klasse habenAssertRaises unkündbare

class myClass(object): 
    pname = "" 

    def __getName(self): 
     return pname 

    def __setName(self, newname): 
     if not isalpha(newname): 
     raise ValueError("Error") 
     elif 
     self.pname = newname 

    name = property(fget=__getName,fset=__setName) 

Da, diese Methoden sind privat, und ich Zugriff auf pname durch Namen, wie kann ich mit AssertRaises testen, wenn AssertRaises nur eine aufrufbare für seine Prüfung akzeptiert?

Antwort

8

Machen Sie Ihre eigenen aufrufbar.

class TestMyClass(unittest.TestCase): 
    def test_should_raise(self): 
     x = myClass() 
     def assign_bad_name(): 
      x.name = "7" 
     self.assertRaises(ValueError, assign_bad_name) 
0

Definieren Sie Ihre eigene Funktion?

class TestRaises(unittest.TestCase): 
    def test_setter(self): 
     def run_test(): 
      c = myClass() 
      c.name = 12 

     self.assertRaises(ValueError, run_test) 
4

Zuerst. Bitte verschwenden Sie keine Zeit mit "privaten" Methoden mit __names.

Sekunde. Mach das.

class TestMyClass(unittest.TestCase): 
    def setUp(self): 
     self.myclass= MyClass() 
    def test_setName_should_fail(self): 
     try: 
      self.myclass.name = 232 
      self.fail("Should have raised an exception") 
     except ValueError, e: 
      self.assertEquals("Error", e.msg) 
+0

+1 für einen Kommentar auf "private" Methoden . –

2

In Python 3 (und 2.7) können Sie eine with Konstruktion verwenden:

class TestMyClass(unittest.TestCase): 
    def test_should_raise(self): 
     x = myClass() 
     with self.assertRaises(ValueError): 
      x.name = "7" 

Dies waren Code beginnt schön bekommen ...