Using mock library (written by Michael Foord)

Peter Otten __peter__ at web.de
Thu Feb 25 14:26:18 CET 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