A juzgar por otras respuestas, nadie excepto @ rob-kennedy habló sobre el call_args_list
.
Es una herramienta poderosa para que pueda implementar exactamente lo contrario de MagicMock.assert_called_with()
call_args_list
es una lista de call
objetos Cada call
objeto representa una llamada realizada en una llamada simulada.
>>> 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)]
Consumir un call
objeto es fácil, ya que puede compararlo con una tupla de longitud 2 donde el primer componente es una tupla que contiene todos los argumentos posicionales de la llamada relacionada, mientras que el segundo componente es un diccionario de los argumentos de palabras clave.
>>> ((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
Entonces, una forma de abordar el problema específico del OP es
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Tenga en cuenta que de esta manera, en lugar de simplemente verificar si se ha llamado a una llamada simulada, a través de MagicMock.called
, ahora puede verificar si se ha llamado con un conjunto específico de argumentos.
Eso es útil Supongamos que desea probar una función que toma una lista y llamar a otra función compute()
, para cada uno de los valores de la lista solo si cumplen una condición específica.
Ahora puede burlarse compute
y probar si ha sido invocado en algún valor pero no en otros.