Я пытаюсь использовать pytest.monkeypatch
для исправления функции, которую я определил в другом файле.Затем мне нужно пропатчить функцию от другой, которая опирается на эту первую monkeypatch
.Вот простой пример
# class_def.py
class C:
def __init__(self):
# Normally, there is something that makes self.p
# that will use a file that will exist on production
raise FileNotFoundError
def factory():
print('in factory')
return C()
----
# function_def.py
from .class_def import factory
foo = factory()
def bar():
return 0
----
# conftest.py
from unittest.mock import MagicMock
import pytest
import playground.class_def
@pytest.fixture(autouse=True)
def patch_c(monkeypatch):
fake_c = MagicMock()
def factory():
print('in monkey factory')
return fake_c
monkeypatch.setattr('playground.class_def.factory', factory)
from .function_def import bar
# Then I would patch bar
И запуск pytest .
завершится неудачно с FileNotFoundError
.Я считаю, что это происходит, потому что я звоню foo = factory()
на верхнем уровне function_def.py
.Я ожидал, что этого не произойдет, потому что я исправляю factory
перед выполнением этого импорта, но, похоже, этого не происходит.Есть ли способ гарантировать, что monkeypatch.setattr
вступит в силу до from .function_def import bar
в conftest.py
?
Кроме того, структура файла выглядит как
playground
|--- __init__.py
|--- conftest.py
|--- class_def.py
|--- function_def