Using mock library (written by Michael Foord)

L

Lacrima

Hello!

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?

Thanks in advance.
Sorry if my English isn't proper enough.

With regards,
Maxim.
 
P

Peter Otten

Lacrima said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top