Макет несуществующего пакета python с помощью monkeypatch в pytest - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь имитировать несуществующий пакет 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, имея при этом возможность имитировать функции, определенные внутри модулей пакета? Я не пытаюсь реплицировать полную структуру каталогов пакета и определять «имитируемые» модули в коде приложения, потому что я не уверен, возникнут ли какие-либо конфликты, когда слой лямбда, содержащий фактический пакет, импортируется в среду выполнения лямбда.

...