Как проверить функцию, которая использует декоратор cache.memoize - PullRequest
0 голосов
/ 03 февраля 2020

У меня возникают проблемы при тестировании функции, которая имеет декоратор для кэширования:

@retry(stop=stop_after_attempt(3))
@cache.memoize(60)
def get_azure_machine_info(rg_name, machine_name, expand="instanceView"):

    try:
        compute_client = get_azure_compute_client()
        return compute_client.virtual_machines.get(rg_name, machine_name, expand=expand)
    except CloudError:
        return None

Мой тест:

@patch("dev_maintenance.machines.get_azure_compute_client")
def test_get_azure_machine_info(get_azure_compute_client):
    cache.delete_memoized('get_azure_machine_info')
    with app.app_context():
        ret = get_azure_machine_info("rg1", "m1")
        get_azure_compute_client.assert_called_once()
        assert len(get_azure_compute_client.return_value.method_calls) == 1
        assert (
            ret == get_azure_compute_client.return_value.virtual_machines.get.return_value
            )
        get_azure_compute_client.return_value.virtual_machines.get.assert_called_once_with(
            "rg1", "m1", expand="instanceView"
        )

До того, как я использовал кэш, тест работал нормально, но Теперь я не могу понять, что здесь происходит.

Ошибка:

enter image description here

1 Ответ

1 голос
/ 03 февраля 2020

cache пытается сделать то же самое с объектами MagicMock, которые создает patch. И он терпит неудачу, так как он «не может выбрать класс unitest.mock.MagicMock»

Самый простой способ обойти это - смоделировать модуль cache в тесте. Здесь вы можете найти указатели: Могу ли я установить патч на Python, прежде чем он обернет функцию?

Сделайте это в приспособлении setUp().

...