Saya menggunakan perpustakaan Mock untuk menguji aplikasi saya, tetapi saya ingin menegaskan bahwa beberapa fungsi tidak dipanggil. Doc mock berbicara tentang metode seperti mock.assert_called_with
dan mock.assert_called_once_with
, tapi saya tidak menemukan sesuatu seperti mock.assert_not_called
atau sesuatu yang berkaitan dengan memverifikasi tiruan TIDAK dipanggil .
Saya bisa menggunakan yang seperti ini, meskipun tidak keren atau pythonic:
def test_something:
# some actions
with patch('something') as my_var:
try:
# args are not important. func should never be called in this test
my_var.assert_called_with(some, args)
except AssertionError:
pass # this error being raised means it's ok
# other stuff
Adakah ide bagaimana mencapainya?
python
unit-testing
mocking
python-mock
Gerard
sumber
sumber
Jawaban:
Ini harus bekerja untuk kasus Anda;
Sampel;
sumber
AttributeError: MockCallable instance has no attribute 'called'
sudo easy_install -U mock
danfrom mock import Mock
pada MacOS, hal di atas berjalan tanpa hambatan. Tidak pernah menginstal Django :)from mock import Mock
dengan Python Mock 0.1.0 untuk pengujian saya. Apakah ada yang terdengar bermasalah?module_to_test.another_module.class = mock.Mock()
, dapatkah Anda mengonfirmasi ini tidak mengingat panggilan di berbagai kasus pengujian (contoh unittest.TestCase)? Saya pikir jumlah panggilan tidak diatur ulang dalam kasus iniMeskipun pertanyaan lama, saya ingin menambahkan bahwa saat ini
mock
perpustakaan (backport of unittest.mock) mendukungassert_not_called
metode.Cukup tingkatkan versi Anda;
pip install mock --upgrade
sumber
Anda dapat memeriksa
called
atributnya, tetapi jika penegasan Anda gagal, hal berikutnya yang ingin Anda ketahui adalah sesuatu tentang panggilan tak terduga, sehingga Anda juga dapat mengatur agar informasi tersebut ditampilkan dari awal. Dengan menggunakanunittest
, Anda dapat memeriksa kontencall_args_list
sebagai gantinya:Ketika gagal, ia memberikan pesan seperti ini:
sumber
Ketika Anda menguji menggunakan kelas inherit unittest.TestCase Anda cukup menggunakan metode seperti:
dan serupa (dalam dokumentasi python Anda menemukan sisanya).
Dalam contoh Anda, kami dapat dengan mudah menyatakan jika properti mock_method.called adalah False , yang berarti metode itu tidak dipanggil.
sumber
Dengan
python >= 3.5
Anda bisa menggunakanmock_object.assert_not_called()
.sumber
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 daftarcall
objek. Setiapcall
objek mewakili panggilan yang dibuat pada panggilan yang diejek.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.Jadi, cara untuk mengatasi masalah khusus OP adalah
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.sumber