कैसे एक आयात नकली करने के लिए, (नकली एबी)?
मॉड्यूल A में इसके शीर्ष पर आयात B शामिल है।
आयात करने से पहले आसान, बस लाइब्रेरी को sys.modules में मॉक करें:
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
और फिर, तब तक जब तक कि A
B के ऑब्जेक्ट्स से वापस आ रहे विशिष्ट प्रकार के डेटा पर निर्भर न हों:
import A
बस काम करना चाहिए।
आप यह भी नकली कर सकते हैं import A.B
:
यहां तक कि अगर आपके पास सबमॉड्यूल है, तो भी यह काम करता है, लेकिन आप प्रत्येक मॉड्यूल का मजाक बनाना चाहेंगे। कहो कि आपके पास यह है:
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()
(मेरा अनुभव: मेरी एक निर्भरता थी जो एक मंच पर काम करती है, विंडोज, लेकिन लिनक्स पर काम नहीं किया, जहां हम अपने दैनिक परीक्षण चलाते हैं। इसलिए मुझे अपने परीक्षणों के लिए निर्भरता का मज़ाक उड़ाने की ज़रूरत है। सौभाग्य से यह एक ब्लैक बॉक्स था, इसलिए मुझे बहुत अधिक सहभागिता स्थापित करने की आवश्यकता नहीं थी।)
मॉकिंग साइड इफेक्ट्स
परिशिष्ट: वास्तव में, मुझे कुछ समय लगने वाले साइड-इफेक्ट का अनुकरण करने की आवश्यकता थी। इसलिए मुझे एक सेकंड के लिए सोने के लिए एक ऑब्जेक्ट विधि की आवश्यकता थी। यह इस तरह काम करेगा:
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__
।