Исправление функции внутри пакета __init__ и использование ее в модуле внутри того же пакета - PullRequest
3 голосов
/ 17 апреля 2019

Я пытаюсь исправить внутреннюю функцию пакета, определенную в __init__.py, которая используется функцией внутри модуля внутри того же пакета.Проблема, с которой я сталкиваюсь, заключается в том, что она не исправляется.

У меня был некоторый успех, когда я изменил оператор импорта внутри модуля, использующего функцию, которую нужно исправить наабсолютный импорт.Проблема в том, что я не хочу абсолютного импорта, поэтому рефакторинг кода будет проблематичен.

Структура моей тестовой установки:

|- mylib
|  |- __init__.py
|  \- process.py
|- tests
|  \- test_process.py
|- setup.py

Инициализация пакета

# __init__.py
def store_info(info):
    raise ValueError('No connection!')

Предполагаемая ситуация

# process.py
from . import store_info


def process_info(info):
    store_info(info)
# test_process.py
from unittest.mock import patch
import mylib.process


@patch('mylib.store_info')
def test_process_info(store_info_mock):
    info = "Some info"
    mylib.process.process_info(info)
    store_info_mock.assert_called_with(info)

Когда я изменил импорт в process.py с относительного на абсолютный импорт, он работает.

# process.py
import mylib


def process_info(info):
    mylib.store_info(info)

С оператором импорта, подобным import mylib, тест проходит с соответствующим исправленным макетом.Используя оператор типа from . import store_data, функция не исправляется.

Существует ли возможность использовать относительный импорт и при этом иметь возможность исправлять функцию в том же пакете?Если так, что является хорошей практикой для этого?

1 Ответ

1 голос
/ 17 апреля 2019

Вы исправляете функцию, в которой она объявлена; вместо этого вы должны исправить функцию, где она на самом деле используется. Измените декоратор на

@patch('mylib.process.store_info')
def test_process_info(store_info_mock):
    ...

См. Где патчить раздел из документации stdlib.

...