Using mock library (written by Michael Foord)
Peter Otten
__peter__ at web.de
Thu Feb 25 08:26:18 EST 2010
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
More information about the Python-list
mailing list