首页 > 解决方案 > Python:如何实现多个动态mock.patch函数?

问题描述

我正在尝试在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 属性错误:输入

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

标签: pythonunit-testingmockingpytest

解决方案


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

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


推荐阅读