How to mock in python and still allow the actual code of mocked function to execute
To mock a method called, you should use the wraps
keyword. Consider the following:
class Foo(object):
def do_thing(self, a):
print("A: %s" % a)
self._do_private_thing(a)
def _do_private_thing(self, a):
print("PRIVATE STUFF HAPPENING.")
print("A: %s" % a)
Then In your test you would have something like:
import mock
a = Foo()
with mock.patch.object(a, '_do_private_thing', wraps=a._do_private_thing) as private_mock:
a.do_thing("lol")
private_mock.assert_called_with("lol")
Hope this helps.
You could set the Mock#side_effect
attribute to your original function.
orig = funct
funct = Mock(side_effect=orig)
I do find loganasherjones' answer more elegant.
Just adding another possibility for those who may need it.