Lacrima wrote: > I use mock library http://www.voidspace.org.uk/python/mock/. There is > no user group for the library, so I post in comp.lang.python and hope > that people who use it will help me. > > The library allows to patch objects, using patch decorator. Patching > is done only within the scope of the function. So if I have a lot of > tests that need specific object to be patched I have to specify the > same decorator for each test method: > > class TestSomething(unittest.TestCase): > > @patch('module.Class', spec = True) > def test_method1(self, MockClass): > Class() > self.assertEquals(MockClass.called) > > @patch('module.Class', spec = True) > def test_method2(self, MockClass): > Class() > MockClass.assert_called_with('foo') > > @patch('module.Class', spec = True) > def test_method3(self, MockClass): > foo = Class() > self.assertRaises(AttributeError, foo.some_method) > > # and more ... > > So for every test method I always do the same patching! How can I > avoid this?
I don't know mock, but the following is generic and should continue to work when you replace the faux patch() function with the one from the mock module. import unittest def patch(v): def patch(f): print "%s-patching" % v, f.__name__ return f return patch def make_postprocess(*args, **kw): def postprocess(name, bases, classdict): for k, v in classdict.items(): if k.startswith("test_"): classdict[k] = patch(*args, **kw)(v) return type(name, bases, classdict) return postprocess class A(unittest.TestCase): __metaclass__ = make_postprocess("Y") def test_bar(self): print "bar" def test_baz(self): print "baz" def foo(self): pass if __name__ == "__main__": unittest.main() Peter -- http://mail.python.org/mailman/listinfo/python-list