Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何实现多个动态mock.patch函数?_Python_Unit Testing_Mocking_Pytest - Fatal编程技术网

Python:如何实现多个动态mock.patch函数?

Python:如何实现多个动态mock.patch函数?,python,unit-testing,mocking,pytest,Python,Unit Testing,Mocking,Pytest,我试图在python中动态模拟/修补一个类的多个@property方法 class Dog(): ... @property def size(self): ..... @property def breed(self): ..... cases = [{"size":9, "breed":"doberman"}, {"size":2, "breed":"pug"}] @pytest.mark.param

我试图在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:
        ...
但是,我得到以下错误:

E属性错误:输入


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

最简单的选择是使用
contextlib.ExitStack


另一种选择是使用pytest的
monkeypatch
fixture:

除了Alex的答案外,以下解决了这个问题:

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

cases.values()
?它是对每个案例进行迭代的dictpytest列表
if "mock" in case:
        for m,v in case["mock"].items():
            def get_value(self):return v
            monkeypatch.setattr(State, m, property(get_value))