In foo.py:
from qux.bar import Baz
def some_fn(arg=Baz):
# Something involving arg()
pass
In test_foo.py (running under pytest, with pytest-mock):
from .foo import some_fn
def test_some_fn(mocker):
mocker.patch('foo.Baz')
# Oh no, tests don't mock it out right!
It took me a tick to realize that the function definition was being evaluated at import time, including the values for the kwargs. Even though the body, of course, wasn’t being evaluated. I solved it with this change to foo.py:
from qux.bar import Baz
def some_fn(arg=None):
if arg is None:
arg = Baz
# Something involving arg()
pass
This is related to the thing where you never write a function signature with {} or [] in it, because you’ll create an instance at evaluation time that’s shared among all the calls to that function.
