Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AssertRaises non-callable

Say I have the class

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)

Seeing as these methods are private, and I am accessing pname through name, how do I test with AssertRaises when AssertRaises only accepts a callable for its test?

like image 668
Iacks Avatar asked Jun 18 '10 20:06

Iacks


3 Answers

Make your own callable.

class TestMyClass(unittest.TestCase):
    def test_should_raise(self):
        x = myClass()
        def assign_bad_name():
            x.name = "7"
        self.assertRaises(ValueError, assign_bad_name)
like image 125
lacker Avatar answered Nov 08 '22 04:11

lacker


First. Please don't waste time on "private" methods with __names.

Second. Do this.

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 )
like image 33
S.Lott Avatar answered Nov 08 '22 03:11

S.Lott


In Python 3 (and 2.7) you can use a with construction:

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

This is were code starts getting beautiful...

like image 2
mzuther Avatar answered Nov 08 '22 04:11

mzuther