Python: Как реализовать несколько динамических функций mock.patch? - PullRequest
1 голос
/ 24 сентября 2019

Я пытаюсь динамически смоделировать / исправить несколько методов @property класса в python, т.е.

class Dog():
     ...

     @property
     def size(self):
        .....

     @property
     def breed(self):
        .....


cases = [{"size":9, "breed":"doberman"}, {"size":2, "breed":"pug"}]

@pytest.mark.parametrize("case", list(cases.values()), ids=list(cases.keys()))
def test_properties(case):

    dog = Dog()
    mocks = ()

    for m, v in case.items():
       mocks += (mock.patch.object(dog, m, return_value=v),)

    with mocks:
        ...

Однако я получаю следующую ошибку:

      with mocks:

E AttributeError: enter

Очевидно, что это не подходящий метод для насмешки нескольких свойств в соответствии с конфигурацией, как показано выше?Может кто-нибудь, пожалуйста, посоветуйте мне, как лучше всего достичь этого, спасибо!

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Самый простой вариант для вас будет использовать contextlib.ExitStack: https://docs.python.org/3/library/contextlib.html#supporting-a-variable-number-of-context-managers

Другой вариант будет использовать monkeypatch крепление pytest: https://docs.pytest.org/en/latest/monkeypatch.html

0 голосов
/ 25 сентября 2019

Помимо ответа от Алекса, это решили следующие вопросы:

if "mock" in case:
        for m,v in case["mock"].items():
            def get_value(self):return v
            monkeypatch.setattr(State, m, property(get_value))
...