【问题标题】:python3 mock member variable get multiple timespython3模拟成员变量多次获取
【发布时间】:2019-06-29 22:01:23
【问题描述】:

我有一个用例,我需要模拟一个成员变量,但我希望它在每次访问时返回不同的值。

示例;

def run_test():
    myClass = MyDumbClass()
    for i in range(2):
        print(myClass.response)

class MyDumbClass():
    def __init__(self):
        self.response = None

 @pytest.mark.parametrize("responses", [[200,201]])
 @patch("blah.MyDumbClass")
 def test_stuff(mockMyDumbClass, responses)
     run_test()
     assert stuff

我在这里希望的是在 run_test 方法中,第一次迭代将打印 200,然后下一次将打印 201。这可能吗,一直在查看 unittest 和 pytest 文档,但找不到任何关于在这种时尚。 刚开始用python3学习pytest和unittest,如果风格不是最好的请见谅。

【问题讨论】:

  • 您能否将我链接到我应该查看您建议的更改的文档,一直在查看 unittest 并且仍然不太了解如何使用补丁执行 with 语句将适用于我的用例。
  • 其实,无视我上面的评论,纯属垃圾。我会尽快给你写一个答案。

标签: python-3.x pytest python-unittest


【解决方案1】:

如果您将 myDumbClass.response 包装在一个 get 函数中 - 比如说 get_response() 那么您可以使用模拟类的 side_effect 参数.

  • side_effect 将模拟方法的 return_value 设置为每次调用模拟方法时返回不同值的迭代器。

例如你可以这样做

def run_test():
    myClass = MyDumbClass()
    for i in range(2):
        print(myClass.get_response())

class MyDumbClass():
    def __init__(self):
        self.response = None

    def get_response(self):
        return self.response

@pytest.mark.parametrize("responses", [([200,201])])
def test_stuff( responses):
    with mock.patch('blah.MyDumbClass.get_response', side_effect=responses):
        run_test()
    assert False

结果

----------------------------------- Captured stdout call ------------------------------------------------------------
200
201

编辑

  • 无需通过上下文管理器进行修补,例如 使用 mock.patch。您可以通过几乎相同的方式通过装饰器进行修补。例如,这很好用

    @patch('blah.MyDumbClass.get_response',side_effect=[200,100])
    def test_stuff(mockMyDumbClass):
        run_test()
        assert False
    ----------------------------------- Captured stdout call ------------------------------------------------------------
    200
    201
    

【讨论】:

  • 有没有办法给.response之类的类成员访问调用添加副作用?
  • 我不知道有什么办法。 side_effect 似乎只对函数调用起作用
猜你喜欢
  • 2012-11-23
  • 2012-02-18
  • 2021-02-28
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
相关资源
最近更新 更多