A juzgar por otras respuestas, nadie excepto @rob-kennedy hablado de la call_args_list
.
Es una poderosa herramienta para la que se puede implementar el contrario exacto de MagicMock.assert_called_with()
call_args_list
es una lista de objetos call
. Cada objeto call
representa una llamada realizada en un exigible burlado.
>>> 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)]
El consumo de un objeto call
es fácil, ya que se puede comparar 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 la palabra clave argumentos.
>>> ((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
Por lo tanto, una forma de abordar el problema específico de la 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 comprobar si un ser burlado exigible ha sido llamado, a través de MagicMock.called
, ahora se puede compruebe si ha sido llamado con un conjunto específico de argumentos.
Eso es útil. Supongamos que desea probar una función que toma una lista y llama a otra función, compute()
, para cada uno de los valores de la lista solo si satisfacen una condición específica.
Ahora puede simular compute
, y probar si se ha llamado a algún valor pero no a otros.
Como señala en su respuesta @Ahmet, assert_not_called ahora es compatible, también en el backport (https://docs.python.org/3/library/unittest.mock.html#unittest.mock .Mock.assert_not_llamado). – Martin