从其他的答案来看,任何人,除非@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
,并测试它是否被调用了某个值,但不是其他值。
由于@Ahmet在他的回答中指出,现在assert_not_called支持,也是在反向移植(https://docs.python.org/3/library/unittest.mock.html#unittest.mock .Mock.assert_not_called)。 – Martin