unittest.TestCase and functools.partial don't seem to mix

Joel Smith js-pythonlist at jk1.net
Mon Oct 5 22:12:02 EDT 2009


Hi List,
I want to make some test case classes that can have some data passed in 
to modify the way they behave. I can't see a straightforward manner to 
pass data to an __init__() method of a class derived from 
unittest.TestCase, or to pass data to a test function within that 
class.  Being a C++ guy, I thought "If only Python had something 
equivalent to boost::bind, I'd be fine," and then I discovered 
functools.partial. I found a post showing how to create classes using 
partial, and I thought I was good to go. The post I found is here:

http://mail.python.org/pipermail/bangpypers/2008-December/000974.html

So I adapted that code to see if it worked in the context of unittest. 
When I run the code, it acts like the parameter I provided with partial 
isn't even there. Any ideas?

#!/usr/bin/python

import functools
import unittest

class GenericWindow:
   def __init__(self, name, width, height, color='white'):
      print('Name: %s, width: %d, height: %d, color: %s' % (name, width, 
height, color))

class TestGenericWindow(unittest.TestCase):
   def __init__(self, methodName, color):
      unittest.TestCase.__init__(self, methodName)
      print('color: %s' % color)
      self.color = color

   def testit():
      GenericWindow('foo', width=100, height=100, color=self.color)

def suite():
   s = unittest.Suite()
   BrownWindowTest = functools.partial(TestGenericWindow, color='brown')
   BlueWindowTest = functools.partial(TestGenericWindow, color='blue')
   GreenWindowTest = functools.partial(TestGenericWindow, color='green')
   s.addTest(unittest.makeSuite(BrownWindowTest))
   s.addTest(unittest.makeSuite(BlueWindowTest))
   s.addTest(unittest.makeSuite(GreenWindowTest))
   return s

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

That code gives the following:

Traceback (most recent call last):
   File "./functools.partial.py", line 32, in <module>
     unittest.main()
   File "/usr/lib/python2.6/unittest.py", line 816, in __init__
     self.parseArgs(argv)
   File "/usr/lib/python2.6/unittest.py", line 837, in parseArgs
     self.test = self.testLoader.loadTestsFromModule(self.module)
   File "/usr/lib/python2.6/unittest.py", line 559, in loadTestsFromModule
     tests.append(self.loadTestsFromTestCase(obj))
   File "/usr/lib/python2.6/unittest.py", line 550, in loadTestsFromTestCase
     return self.suiteClass(map(testCaseClass, testCaseNames))
 TypeError: __init__() takes exactly 3 arguments (2 given)

Thanks for having a look,
Joel



More information about the Python-list mailing list