วิธีการจำลองการนำเข้า (mock AB)
โมดูล A รวมถึงการนำเข้า B ที่ด้านบน
ง่ายเพียงจำลองไลบรารีใน sys.modules ก่อนที่จะได้รับการนำเข้า:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
จากนั้นตราบA
ใดที่ไม่ต้องพึ่งพาข้อมูลชนิดใดประเภทหนึ่งที่ถูกส่งคืนจากวัตถุของ B:
import A
ควรจะทำงาน
คุณยังสามารถเยาะเย้ยimport A.B
:
วิธีนี้ใช้ได้แม้ว่าคุณจะมี submodules แต่คุณจะต้องจำลองแต่ละโมดูล สมมติว่าคุณมีสิ่งนี้:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
หากต้องการเยาะเย้ยเพียงทำด้านล่างก่อนที่จะนำเข้าโมดูลที่มีด้านบน:
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(ประสบการณ์ของฉัน: ฉันมีการพึ่งพาซึ่งทำงานบนแพลตฟอร์มเดียว Windows แต่ไม่ได้ทำงานบน Linux ที่เราทำการทดสอบรายวันดังนั้นฉันต้องจำลองการพึ่งพาสำหรับการทดสอบของเราโชคดีที่มันเป็นกล่องดำดังนั้น ฉันไม่จำเป็นต้องตั้งค่าการโต้ตอบมากมาย)
ผลข้างเคียงที่เยาะเย้ย
ภาคผนวก: จริง ๆ แล้วฉันต้องการจำลองผลข้างเคียงที่ใช้เวลาพอสมควร ดังนั้นฉันต้องการวิธีการของวัตถุที่จะนอนหลับเป็นครั้งที่สอง ที่จะทำงานเช่นนี้:
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)
จากนั้นรหัสใช้เวลาในการรันเช่นเดียวกับวิธีการจริง
Mock
จะไม่แก้ไขแอตทริบิวต์มายากลบางคน (__%s__
)__name__
เช่น