Код: Выделить всё
class CoinName(str, Enum):
USDT = "USDT"
BTC = "BTC"
ETH = "ETH"
BNB = "BNB"
XRP = "XRP"
ADA = "ADA"
...
У меня есть такой макет:
Код: Выделить всё
@pytest.fixture
def mock_binance_client(mocker):
mock_client = MockBinanceClient()
mocker.patch("binance.Client", return_value=mock_client)
return mock_client
Пока я нашел два решения:
В conftest.py :
Код: Выделить всё
def pytest_configure(config):
from pytest_mock import plugin
mocker = plugin.MockerFixture(config)
mock_definitions = mocker.Mock()
mock_definitions.CoinName = MockCoinName
mocker.patch.dict(
"sys.modules", {"trading_bot.definitions": mock_definitions})
Тогда, если в conftest.py я нормально издеваюсь:
Код: Выделить всё
@pytest.fixture(autouse=True)
def mock_coin_name(mocker):
patched = mocker.patch(
"trading_bot.definitions.CoinName", MockCoinName)
Однако это не сработает, если я выполню второй вариант и не изменю метод импорта, как тогда другие файлы имеют еще одну ссылку на CoinName, через trade_bot.foo.CoinName, и она импортируется до запуска любого приспособления.
Мой вопрос:
Первый решение кажется слишком хакерским, а второе — слишком громоздким. Есть ли способ не менять способ импорта в свой проект, но при этом не взламывать sys.modules напрямую и не издеваться над перечислением? Или мне следует структурировать свой код по-другому, например, не использовать подобные перечисления?
Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/792 ... t-globally