Я пытаюсь имитировать несуществующий пакет python, который используется в лямбда-функции AWS, но он добавляется в среду выполнения лямбда во время выполнения, потому что он определен как уровень лямбда. Это означает, что у меня нет доступа к этому пакету в коде моего приложения и я не могу правильно писать тесты, потому что я не могу обойти ошибки импорта для отсутствующего пакета.
Я попытался издеваться над словарем python sys.modules
, установив для требуемых модулей пакета экземпляры MagicMock
, но это не кажется правильным, потому что я не могу издеваться над функциями внутри этих модулей без явного определение этих модулей и добавление в них фиктивных функций. И сложно имитировать полный пакет со сложной структурой каталогов с модулями, размещенными внутри разных подпакетов.
@pytest.fixture
def mock_layer_imports(monkeypatch):
mocked_module = MagicMock()
monkeypatch.setitem(sys.modules, 'mocked_module', mocked_module)
mocked_sub_module = MagicMock()
monkeypatch.setitem(sys.modules, 'mocked_module.mocked_sub_module', mocked_sub_module)
Есть ли лучший способ имитировать полный python пакет, который недоступен в python s sys.path
, имея при этом возможность имитировать функции, определенные внутри модулей пакета? Я не пытаюсь реплицировать полную структуру каталогов пакета и определять «имитируемые» модули в коде приложения, потому что я не уверен, возникнут ли какие-либо конфликты, когда слой лямбда, содержащий фактический пакет, импортируется в среду выполнения лямбда.