Исправление функции внутри пакета __init__ и использование ее в модуле внутри того же пакета

#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. Рад, что смог помочь!