#python #python-3.x #pytest #python-unittest
#питон #python-3.x #pytest #python-unittest
Вопрос:
Я пытаюсь исправить внутреннюю функцию пакета, определенную в __init__.py
, которая используется функцией внутри модуля внутри того же пакета. Проблема, с которой я сталкиваюсь, заключается в том, что она не исправляется.
У меня был некоторый успех, когда я изменил инструкцию import внутри модуля, который использует функцию, которую необходимо исправить, на абсолютный импорт. Проблема в том, что я не хочу абсолютного импорта, поэтому рефакторинг кода будет сопряжен с трудностями.
Структура моей тестовой установки такова:
|- 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, подобной import mylib
тесту, он проходит с соответствующим исправленным макетом. Использование оператора, подобного from . import store_data
функции, не исправляется.
Есть ли возможность использовать относительный импорт и при этом иметь возможность исправлять функцию в том же пакете? Если да, то какова хорошая практика для этого?
Ответ №1:
Вы исправляете функцию там, где она объявлена; вместо этого вы должны исправить функцию там, где она фактически используется. Измените декоратор на
@patch('mylib.process.store_info')
def test_process_info(store_info_mock):
...
Смотрите раздел «Где исправлять» в документах stdlib.
Комментарии:
1. Это было именно решение моей проблемы. Спасибо.
2. Рад, что смог помочь!