【问题标题】:Python pytest-mock assert_has_callsPython pytest-mock assert_has_calls
【发布时间】:2020-05-07 09:38:07
【问题描述】:

我正在研究名为 pytest-mock (https://github.com/pytest-dev/pytest-mock) 的优秀 pytest 插件,现在我正在尝试一些带有 assert_has_calls 的示例。简而言之,我正在测试 B 类的一个实例,更具体地说,该实例如何与 A 类的实例交互(我在其中模拟了“time_sumption_task”方法)。

该示例正在使用 alt。 B(见代码中的 cmets)。我更喜欢alt。 A,而是直接mock A类中的方法,而不是mock通过B类的实例(obj)访问的A类实例中的方法。

class A(object):
    def do_time_consuming_task(self, timeout):
        return True


class B(object):
    def __init__(self):
        self.a = A()

    def do_work(self, timeout):
        return self.a.do_time_consuming_task(timeout)


def test_calls(mocker):
    # Prepare
    obj = B()
    #mock_a = mocker.patch.object(A, 'do_time_consuming_task', autospec=True)  # Alt. A
    mock_a = mocker.patch.object(obj.a, 'do_time_consuming_task', autospec=True)  # Alt. B
    mock_a.return_value = True

    # Exercise
    obj.do_work(timeout=100)
    obj.do_work(timeout=50)

    # Assert
    mock_a.assert_has_calls([mocker.call(100), mocker.call(50)])

【问题讨论】:

    标签: python python-unittest python-unittest.mock pytest-mock


    【解决方案1】:

    在 pytest-mock 的作者提供的另一个答案的帮助下设法弄清楚了。

    如果使用 alt,则应按如下方式调用断言。答:

    mock_a.assert_has_calls([mocker.call(mocker.ANY, 100), mocker.call(mocker.ANY, 50)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2019-12-15
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多