从其他答案来看,除了@rob-kennedy没有人谈论call_args_list
.
它是一个强大的工具,你可以实现完全相反的MagicMock.assert_called_with()
call_args_list
是一个call
对象列表。每个call
对象代表对模拟可调用对象的调用。
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m.call_args_list
[]
>>> m(42)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42)]
>>> m(42, 30)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42), call(42, 30)]
使用一个call
对象很容易,因为您可以将它与长度为 2 的元组进行比较,其中第一个组件是包含相关调用的所有位置参数的元组,而第二个组件是关键字参数的字典。
>>> ((42,),) in m.call_args_list
True
>>> m(42, foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((42,), {'foo': 'bar'}) in m.call_args_list
True
>>> m(foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((), {'foo': 'bar'}) in m.call_args_list
True
因此,解决 OP 特定问题的一种方法是
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
MagicMock.called
请注意,通过这种方式,您现在可以检查是否已使用一组特定的参数调用了它,而不仅仅是检查是否已调用模拟的可调用对象。
这很有用。假设您想测试一个函数,该函数接受一个列表并调用另一个函数,compute()
仅当列表的每个值满足特定条件时才调用。
您现在可以模拟compute
,并测试它是否已在某些值上调用,但在其他值上未调用。