Menilai dari jawaban lain, tidak ada seorang pun kecuali @ rob-kennedy yang berbicara tentang call_args_list.
Ini adalah alat yang ampuh untuk itu Anda dapat menerapkan sebaliknya MagicMock.assert_called_with()
call_args_listadalah daftar callobjek. Setiap callobjek mewakili panggilan yang dibuat pada panggilan yang diejek.
>>> 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)]
Mengkonsumsi callobjek itu mudah, karena Anda bisa membandingkannya dengan tuple dengan panjang 2 di mana komponen pertama adalah tuple yang berisi semua argumen posisi panggilan terkait, sedangkan komponen kedua adalah kamus argumen kata kunci.
>>> ((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
Jadi, cara untuk mengatasi masalah khusus OP adalah
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Perhatikan bahwa dengan cara ini, alih-alih hanya memeriksa apakah callable yang diejek telah dipanggil, via MagicMock.called, Anda sekarang dapat memeriksa apakah telah dipanggil dengan serangkaian argumen tertentu.
Itu berguna. Katakanlah Anda ingin menguji suatu fungsi yang mengambil daftar dan memanggil fungsi lain compute(),, untuk masing-masing nilai daftar hanya jika mereka memenuhi kondisi tertentu.
Anda sekarang dapat mengejek compute, dan menguji apakah telah dipanggil pada beberapa nilai tetapi tidak pada yang lain.