【问题标题】:Python:How to implement multiple dynamic mock.patch functions?Python:如何实现多个动态mock.patch函数?
【发布时间】:2020-01-24 08:08:08
【问题描述】:

我正在尝试在 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

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

【问题讨论】:

  • cases.values()?它是一个字典列表
  • pytest 遍历每个案例

标签: python unit-testing mocking pytest


【解决方案1】:

除了亚历克斯的回答,以下解决了它:

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

【讨论】:

    【解决方案2】:

    对您来说最简单的选择是使用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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-12
      • 2012-05-09
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2016-09-09
      相关资源
      最近更新 更多