Bir ithalat alay etmek nasıl, (sahte AB)?
Modül A, üst kısmında B ithalatını içerir.
Kolay, sadece ithal edilmeden önce sys.modules içindeki kütüphaneyi alay et:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
ve sonra, A
B'nin nesnelerinden döndürülen belirli veri türlerine dayanmadığı sürece :
import A
sadece çalışmalı.
Ayrıca alay edebilirsiniz import A.B
:
Bu, alt modülleriniz olsa bile çalışır, ancak her modülü taklit etmek istersiniz. Diyelim ki:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
Alay etmek için, yukarıdakileri içeren modül içe aktarılmadan önce aşağıdakileri yapmanız yeterlidir:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(Deneyimlerim: Tek bir platformda çalışan bir bağımlılığım vardı, Windows, ancak günlük testlerimizi yaptığımız Linux'ta çalışmadı. Bu yüzden testlerimiz için bağımlılığı alay etmeliydim. Neyse ki bu kara bir kutuydu, bu yüzden Çok fazla etkileşim kurmam gerekmedi.)
Alaycı Yan Etkiler
Zeyilname: Aslında biraz zaman alan bir yan etkiyi simüle etmem gerekiyordu. Bu yüzden bir saniye uyumak için bir nesnenin yöntemine ihtiyacım vardı. Bu şöyle çalışır:
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)
Ve sonra kodun çalıştırılması biraz zaman alıyor, tıpkı gerçek yöntem gibi.
Mock
(__%s__
) gibi bazı sihirli özellikleri yamalamayacağını unutmayın__name__
.