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_list
adalah daftar call
objek. Setiap call
objek 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 call
objek 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.