Kami telah menggunakan Mock untuk python untuk sementara waktu.
Sekarang, kita memiliki situasi di mana kita ingin mengejek suatu fungsi
def foo(self, my_param):
#do something here, assign something to my_result
return my_result
Biasanya, cara untuk mengejek ini adalah (dengan asumsi foo menjadi bagian dari objek)
self.foo = MagicMock(return_value="mocked!")
Bahkan, jika saya memanggil foo () beberapa kali saya dapat menggunakan
self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])
Sekarang, saya menghadapi situasi di mana saya ingin mengembalikan nilai tetap ketika parameter input memiliki nilai tertentu. Jadi jika katakan "my_param" sama dengan "sesuatu" maka saya ingin mengembalikan "my_cool_mock"
Ini sepertinya tersedia di mockito untuk python
when(dummy).foo("something").thenReturn("my_cool_mock")
Saya telah mencari cara untuk mencapai hal yang sama dengan Mock tanpa keberhasilan?
Ada ide?
python
unit-testing
mocking
mockito
Juan Antonio Gomez Moriano
sumber
sumber
monkeypatch
. Monkeypatch lebih untuk "mengganti fungsi ini demi pengujian," sedangkan Mock adalah apa yang Anda gunakan ketika Anda juga ingin memeriksamock_calls
atau membuat pernyataan tentang apa yang dipanggil dengan dan sebagainya. Ada tempat untuk keduanya, dan saya sering menggunakan keduanya pada waktu yang berbeda dalam file tes yang diberikan.Jawaban:
http://www.voidspace.org.uk/python/mock/mock.html#calling
sumber
side effect
adalah istilah yang akurat: en.wikipedia.org/wiki/Side_effect_(computer_science)CallableMixin.side_effect
, tetapi bahwa fungsi terpisah yang didefinisikan dalam contoh memiliki nama yang sama.Seperti yang ditunjukkan pada objek Python Mock dengan metode yang disebut beberapa kali
Solusinya adalah menulis sendiri side_effect saya
Itu yang berhasil
sumber
Efek samping mengambil fungsi (yang juga bisa menjadi fungsi lambda ), jadi untuk kasus sederhana Anda dapat menggunakan:
sumber
Saya telah berakhir di sini mencari " cara mengejek fungsi berdasarkan argumen masukan " dan saya akhirnya menyelesaikan ini dengan membuat fungsi aux sederhana:
Sekarang:
Semoga ini bisa membantu seseorang!
sumber
Anda juga dapat menggunakan
partial
darifunctools
jika Anda ingin menggunakan fungsi yang mengambil parameter tetapi fungsi yang Anda cemooh tidak. Misal seperti ini:Ini akan mengembalikan callable yang tidak menerima parameter (seperti timezone.now Django), tetapi fungsi mock_year saya tidak.
sumber
got multiple values for argument
.Hanya untuk menunjukkan cara lain untuk melakukannya:
sumber
Anda juga dapat menggunakan
@mock.patch.object
:Katakanlah modul
my_module.py
menggunakanpandas
untuk membaca dari database dan kami ingin menguji modul ini denganpd.read_sql_table
metode mengejek (yangtable_name
dianggap sebagai argumen).Apa yang dapat Anda lakukan adalah untuk membuat (dalam uji Anda) sebuah
db_mock
metode yang kembali objek yang berbeda tergantung pada argumen yang disediakan:Dalam fungsi tes Anda, Anda kemudian lakukan:
sumber
Jika Anda "ingin mengembalikan nilai tetap ketika parameter input memiliki nilai tertentu" , mungkin Anda bahkan tidak memerlukan tiruan dan dapat menggunakan
dict
bersama denganget
metodenya:Ini bekerja dengan baik ketika output palsu Anda adalah pemetaan input. Ketika itu adalah fungsi input saya sarankan menggunakan
side_effect
sesuai jawaban Amber .Anda juga dapat menggunakan kombinasi keduanya jika Anda ingin mempertahankan
Mock
kemampuan (assert_called_once
,call_count
dll):sumber
Saya tahu ini pertanyaan yang cukup lama, mungkin bisa membantu sebagai perbaikan menggunakan python lamdba
sumber