`resetall` does not work when using `create_autospec`
inikolaev opened this issue · 2 comments
Not sure if there exists a different way to achieve what I want, but I use create_autospec
extensively and ran into a case where I need to be able to reset it between the tests. I can do this manually, but then I ran into this plugin and noticed resetall
, but it turned out that mocks created with create_autospec
are not taken into account by resetall
.
Consider the following example:
@pytest.fixture(scope="session")
def service_mock():
...
@pytest.fixture(scope="session")
def expensive_to_construct_fixture(service_mock):
...
I want to avoid creating the expensive fixture on each test run, so I use session
scope, but it depends on other mocks which I need to be able to configure and assert in my tests, but then I have to reset them manually.
I would rather create function scope autouse fixture, that would reset all the mocks:
@pytest.fixture(autouse=True)
def reset_all_mocks(session_mocker) -> None:
session_mocker.resetall()
But unfortunately mocks created with create_autospec
are not added to the _patches_and_mocks
and thus I cannot use resetall
.
Would this be ok to add support for create_autospec
? It seems to be pretty straightforward to add it - pretty much something like this would work, but maybe you have some other considerations?
def create_autospec(self, *args, **kwargs):
m = self.mock_module.create_autospec(*args, **kwargs)
self._patches_and_mocks.append((None, m))
return m
Hi @inikolaev,
Thanks for the report!
Yeah that sounds reasonable, would you like to open a PR with that feature?
Hi @inikolaev,
Thanks for the report!
Yeah that sounds reasonable, would you like to open a PR with that feature?
Sure, I can make a PR!