2010-06-18 16 views
6

że mam klasaassertRaises non-wywoływalne

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) 

Widząc, jak te metody są prywatne, a ja dostępu pname poprzez nazwę, jak mogę przetestować z assertRaises gdy assertRaises akceptuje tylko wywoływalnym jego testu?

Odpowiedz

8

Stwórz własne wywołanie.

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

Definiowanie własnej funkcji?

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

     self.assertRaises(ValueError, run_test) 
4

Pierwsza. Proszę nie tracić czasu na "prywatne" metody z __names.

Po drugie. Zrób to.

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 za komentarz na temat "prywatnych" metod . –

2

W Pythonie 3 (2,7) i można użyć with budowy:

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

Jest to był kod zaczyna się piękny ...