2010-06-18 63 views
6

說我有類AssertRaises不可贖回

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) 

看到,因爲這些方法都是私有的,我通過名字來訪問PNAME,我怎麼跟AssertRaises測試時AssertRaises只接受其測試可調用?

回答

8

讓你自己調用。

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

定義您自己的功能?

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

     self.assertRaises(ValueError, run_test) 
4

首先,請不要浪費時間在__names的「私人」方法。

二。做這個。

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對 「私」 的方法評論。 – 2010-06-18 21:14:05

2

在Python 3(2.7),你可以使用一個with建設:

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

這是代碼開始變得美麗......