Как имитировать импорт в рамках импорта

#python #unit-testing #mocking #python-module #python-mock

Вопрос:

Поэтому я пытаюсь протестировать поиск api с помощью моих фиктивных данных.

Я тестирую метод, в transform.py котором импортируется поиск модуля

 import lookup

col = lookup.ColFinder()
url = "xyz"
if col.is_present(url):
  do this
 

lookup.py

 import secdata

class ColFinder():
   def is_present(url):
       if url in secdata.CUSTOM_STUFF:
           return secdata.CUSTOM_STUFF[url]
 

secdata.py

 secdata.CUSTOM_STUFF=load("some_file")
 

Я хочу поиздеваться над JSON (файл, загружаемый внутри secdata.CUSTOM_STUFF )

Я пытался издеваться, используя unittest.mock с некоторой пользовательской конфигурацией в тестах/ресурсах

 
CUSTOM_CONFIG = secdata.load(os.path.join(os.path.dirname(__file__),'/resources/custom_config.json'))

import mock
@mock.patch("transform.lookup.secdata.CUSTOM_STUFF" , return_value=CUSTOM_CONFIG)
def test_blah_blah(self, *_):
 

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

Заранее спасибо.

Комментарии:

1. вам нужно смоделировать ColFinder и протестировать различные сценарии этого, но не secdata так, в этом случае вы бы протестировали логические ветви is_present

2. @gold_cy Спасибо вам за ваш ответ. Да, я смог отдельно поиздеваться над значениями is_present, но я ищу способ, с помощью которого я могу просто поиздеваться над значением secdata в поиске вместо того, чтобы издеваться над ветвями

3. но это неправильный способ написания модульного теста, если вы хотите протестировать secdata , то протестируйте этот модуль самостоятельно. поскольку вы проводите тестирование transform.py , вам не следует беспокоиться о том, что происходит в lookup.py

4. Я не хочу тестировать secdata, я просто хочу издеваться над всем файлом, так как я пишу несколько тестов, и не хочу издеваться над отдельным файлом. Я хочу сделать что-то вроде ( load_config ) один раз