Diğer cevaplar bakılırsa, dışında hiç kimse soymak-Kennedy @ bahsettik call_args_list
.
Tam tersini uygulayabileceğiniz güçlü bir araçtır. MagicMock.assert_called_with()
call_args_list
call
nesnelerin bir listesidir . Her call
nesne, sahte bir çağrılabilir üzerinde yapılan bir çağrıyı temsil eder.
>>> 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)]
Bir call
nesneyi tüketmek kolaydır, çünkü onu birinci bileşenin ilgili çağrının tüm konumsal argümanlarını içeren bir demet olduğu, ikinci bileşenin ise anahtar kelime argümanlarının bir sözlüğü olduğu 2 uzunluğundaki bir demet ile karşılaştırabilirsiniz.
>>> ((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
Öyleyse, OP'nin özel sorununu ele almanın bir yolu,
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Bu şekilde, sadece sahte bir çağrılabilirin çağrılıp çağrılmadığını kontrol etmek yerine MagicMock.called
, şimdi belirli bir argüman kümesiyle çağrılıp çağrılmadığını kontrol edebilirsiniz.
Bu yararlıdır. Listenin compute()
her bir değeri için, yalnızca belirli bir koşulu karşıladıklarında , bir listeyi alan ve başka bir işlevi çağıran bir işlevi test etmek istediğinizi varsayalım.
Şimdi alay edebilir compute
ve bir değer için çağrılıp diğerlerinde çağrılmadığını test edebilirsiniz.