Bagaimana cara mengejek impor, (mengejek AB)?
Modul A termasuk impor B di atasnya.
Mudah, cukup mengejek perpustakaan di sys.modules sebelum diimpor:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
dan kemudian, selama A
tidak bergantung pada tipe data tertentu yang dikembalikan dari objek B:
import A
seharusnya hanya bekerja.
Anda juga bisa mengejek import A.B
:
Ini berfungsi bahkan jika Anda memiliki submodula, tetapi Anda ingin mengejek setiap modul. Katakan Anda memiliki ini:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Untuk mengejek, cukup lakukan di bawah ini sebelum modul yang berisi di atas diimpor:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Pengalaman saya: Saya memiliki ketergantungan yang bekerja pada satu platform, Windows, tetapi tidak bekerja di Linux, di mana kami menjalankan tes harian kami. Jadi saya perlu mengejek ketergantungan untuk tes kami. Untungnya itu adalah kotak hitam, jadi Saya tidak perlu mengatur banyak interaksi.)
Efek Samping Mengejutkan
Tambahan: Sebenarnya, saya perlu mensimulasikan efek samping yang memerlukan waktu. Jadi saya perlu metode objek untuk tidur sebentar. Itu akan bekerja seperti ini:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
# setup the side-effect:
from time import sleep
def sleep_one(*args):
sleep(1)
# this gives us the mock objects that will be used
from foo.bar import MyObject
my_instance = MyObject()
# mock the method!
my_instance.method_that_takes_time = mock.MagicMock(side_effect=sleep_one)
Dan kemudian kode membutuhkan waktu untuk berjalan, seperti metode yang sebenarnya.
Mock
tidak akan menambal beberapa atribut ajaib (__%s__
) seperti__name__
.