sxp*_*xpy 6 python python-unittest python-unittest.mock pytest-mock
我正在研究名为 pytest-mock (https://github.com/pytest-dev/pytest-mock)的优秀 pytest 插件,现在我正在尝试使用assert_has_calls 的一些示例。简而言之,我正在测试 B 类的实例,更具体地说,该实例如何与 A 类的实例交互(我在其中模拟了“time_consuming_task”方法)。
该示例正在使用 alt。B(参见代码中的注释)。我更喜欢替代方案。A,而是直接模拟 A 类中的方法,而不是模拟通过类 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)])
Run Code Online (Sandbox Code Playgroud)
在 pytest-mock 作者提供的另一个答案的帮助下设法解决了这个问题。
如果使用 alt,则应按如下方式调用断言。A:
mock_a.assert_has_calls([mocker.call(mocker.ANY, 100), mocker.call(mocker.ANY, 50)])
Run Code Online (Sandbox Code Playgroud)