Python:How to 实现多个动态mock.patch函数?

2024-09-20 03:57:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python中动态模拟/修补一个类的多个@property方法

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

显然,这不是根据如上所示的配置模拟多个属性的合适方法?有人能告诉我如何最好地实现这一点,谢谢


Tags: 方法selfsizedefwith动态propertylist
2条回答

除了亚历克斯的回答外,以下问题解决了:

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

最简单的方法是使用contextlib.ExitStackhttps://docs.python.org/3/library/contextlib.html#supporting-a-variable-number-of-context-managers

另一种选择是使用pytest的monkeypatchfixture:https://docs.pytest.org/en/latest/monkeypatch.html

相关问题 更多 >