A giudicare dalle altre risposte, nessuno, tranne @ rob-kennedy, ha parlato del call_args_list
.
È uno strumento potente per cui puoi implementare esattamente il contrario MagicMock.assert_called_with()
call_args_list
è un elenco di call
oggetti. Ogni call
oggetto rappresenta una chiamata fatta su un callable deriso.
>>> 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)]
Il consumo di un call
oggetto è facile, poiché è possibile confrontarlo con una tupla di lunghezza 2 in cui il primo componente è una tupla contenente tutti gli argomenti posizionali della chiamata correlata, mentre il secondo componente è un dizionario degli argomenti delle parole chiave.
>>> ((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
Quindi, un modo per affrontare il problema specifico del PO è
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Si noti che in questo modo, invece di verificare solo se è stato chiamato un callable deriso, tramite MagicMock.called
ora è possibile verificare se è stato chiamato con un set specifico di argomenti.
Questo è utile Supponi di voler testare una funzione che accetta un elenco e chiama un'altra funzione compute()
, per ciascuno dei valori dell'elenco solo se soddisfano una condizione specifica.
Ora puoi deridere compute
e testare se è stato chiamato su un valore ma non su altri.