Как высмеять Enum в pytest глобальноPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как высмеять Enum в pytest глобально

Сообщение Anonymous »

У меня есть проект торгового бота, назовем его trade_bot. Я использую python-binance. У меня есть перечисление

Код: Выделить всё

class CoinName(str, Enum):
USDT = "USDT"

BTC = "BTC"
ETH = "ETH"
BNB = "BNB"
XRP = "XRP"
ADA = "ADA"
...
который состоит из 100 названий монет. Я использую его для подсказки типов, а также через list(CoinName) для перебора интересующих меня монет, отправки запросов, получения исторических цен и фильтрации моих текущих активов. Я хочу использовать только его часть для тестов. Я использую pytest и pytest-mock.
У меня есть такой макет:

Код: Выделить всё

@pytest.fixture
def mock_binance_client(mocker):
mock_client = MockBinanceClient()
mocker.patch("binance.Client", return_value=mock_client)

return mock_client
Это нормально, так как в тестах я использую его напрямую или внедряю явно. Однако я изо всех сил пытаюсь высмеять CoinName.
Пока я нашел два решения:
В 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})
или мне нужно добавить из trade_bot.definitions import CoinName в мой проект __init__.py и везде, где я это делаю, из trade_bot.definitions import CoinName Мне нужно изменить его, чтобы импортировать Trading_bot, а затем использовать его через Trading_bot.CoinName.
Тогда, если в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Есть ли способ глобально высмеять класс, инициализированный вне функции?
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • @pytest.mark.skip против @pytest.mark.xfail в Pytest
    Anonymous » » в форуме Python
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • @pytest.mark.skip против @pytest.mark.xfail в Pytest
    Anonymous » » в форуме Python
    0 Ответы
    52 Просмотры
    Последнее сообщение Anonymous
  • @pytest.mark.skip vs @pytest.mark.xfail в pytest
    Anonymous » » в форуме Python
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Как я могу заставить typing.overload работать с enum.Enum?
    Anonymous » » в форуме Python
    0 Ответы
    50 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»