I use py.test and really like the funcarg approach to inject objects into test functions. In my testing I need to work with Mock objects, as I have a lot external dependencies. I use monkeypatch to replace certain attributes with the mock objects.
The problem I have is, that I will often end up with a bunch of tests that will use a certain funcarg and always require the same attributes patched. So far I replace the attributes in every test function.
Is there a way to use monkeypatch in my funcarg functions, and remove this duplicated code from the individual tests?
import sys
import pytest
from mock import Mock
#----------------------------------------------------------------------
def pytest_funcarg__api(request):
""""""
api = myclass()
#do some initialisation...
return api
#----------------------------------------------------------------------
def test_bla1(monkeypatch, api):
""""""
monkeypatch.setattr(api,"get_external_stuff",Mock())
monkeypatch.setattr(api,"morestuff",Mock())
api.do_something1()
assert not api.a
#----------------------------------------------------------------------
def test_bla2(monkeypatch, api):
""""""
monkeypatch.setattr(api,"get_external_stuff",Mock())
monkeypatch.setattr(api,"morestuff",Mock())
api.do_something2()
assert api.b
if __name__=='__main__':
pytest.main(args=["-v",sys.argv[0]])