Без дополнительной информации, я предполагаю, что ваша проблема в том, что foo
не может быть найдено, когда вы запускаете тесты для bar
(например, ValueError: Attempted relative import in non-package
). Если это так, то, скорее всего, ваша проблема связана с организацией файла / каталога вашего проекта (решение см. В этом SO post ).
Кроме того, возможно, ваша проблема в том, что у вас нет пакета foo
, расположенного в bar
в качестве подмодуля. Или, может быть, у вас не установлен foo
пункт глобально. Если это так, то вам нужно настроить виртуальную среду (встроенная библиотека venv является односторонней), где foo
- это pip. Вы упомянули, что foo
отсутствует в PyPi, но если он у вас есть на GitHub, вы можете легко добавить его в requirements.txt
, чтобы его можно было установить и установить в вашей виртуальной среде.
Если эти решения не отвечают на ваш вопрос, то, возможно, вы на самом деле спрашиваете, как вы можете контролировать поведение foo
, когда тестируется bar
? Если это так, то вам следует изучить mocking и / или patching , с помощью которых вы можете создать «поддельный» объект в вашем наборе тестов для имитации и замены другого объекта в вашем программа. В вашем случае вы хотите установить foo
, чтобы ваши тесты для bar
не зависели от поведения foo
. Подобное выделение bar
является неотъемлемой частью концепции модульного тестирования.
Если вы используете unittest
, есть отличный модуль unittest.mock
. unittest.mock
предоставляет класс с именем Mock
, который вы можете использовать для имитации реальных объектов в вашей кодовой базе. Библиотека также предоставляет функцию с именем patch()
, которая заменяет реальные объекты в вашем коде экземплярами Mock
. Вы можете использовать patch()
в качестве декоратора или диспетчера контекста, что дает вам контроль над областью, в которой объект будет макетироваться. После выхода из указанной области действия patch()
очистит ваш код, заменив поддельные объекты их оригинальными аналогами. Я нашел эту статью полезной для начала работы с Mock
и patch()
.
Надеюсь, я как-то ответил на ваш вопрос. Если нет, дайте мне знать, и я могу обновить!