En Mon, 05 Oct 2009 23:12:02 -0300, Joel Smith <js-pythonl...@jk1.net> escribió:

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?

The problem isn't with partial - which works fine. By using unittest.main() your're building the default test suite using the default rules - your customized suite isn't used at all. Try with:

if __name__ == '__main__':
    unittest.TextTestRunner().run(suite())

Note that you don't *have* to use partial in this case, as you're building the suite yourself. Just create the TestCase instances manually:

    suite = unittest.TestSuite([
      TestGenericWindow('testit', 'brown'),
      TestGenericWindow('testit', 'blue'),
      TestGenericWindow('testit', 'green')
      ])
    unittest.TextTestRunner().run(suite)

You may get rid of the 'testit' repetitive argument if you omit it from __init__ -- the generic TestLoader won't like it, but it doesn't like it right now because of the color argument, so you don't lose anything.

Another approach, if you want to stay with the built-in testing infrastructure:

class TestGenericWindow(unittest.TestCase):

  def _testit(self, color):
     # actual test implementation
     GenericWindow('foo', width=100, height=100, color=color)

  def test_brown(self):
     return self._testit('brown') # provide desired parameters

  def test_blue(self):
     return self._testit('blue')

unittest.main() should still work with this TestCase as written, without a custom Suite/Loader.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to