जब मैं पहली बार इस समस्या को लेकर भागा, तो मैं अपने दिमाग को घंटों तक रैक करने के लिए इस्तेमाल करता हूं। मुझे इसे संभालने का बहुत आसान तरीका मिला।
यह डेकोरेटर को पूरी तरह से बायपास कर देगा, जैसे कि लक्ष्य को पहले से सजाया नहीं गया था।
यह दो भागों में टूट गया है। मैं निम्नलिखित लेख पढ़ने का सुझाव देता हूं।
http://alexmarandon.com/articles/python_mock_gotchas/
दो गोत्र जिन्हें मैं चला रहा था:
1.) अपने फ़ंक्शन / मॉड्यूल के आयात से पहले डेकोरेटर को मॉक करें।
मॉड्यूल लोड होने के समय डेकोरेटर और फ़ंक्शंस परिभाषित किए जाते हैं। यदि आप आयात करने से पहले मजाक नहीं करते हैं, तो यह नकली की उपेक्षा करेगा। लोड होने के बाद, आपको एक अजीब mock.patch.object करना होगा, जो और भी निराशाजनक हो जाता है।
2.) सुनिश्चित करें कि आप डेकोरेटर को सही रास्ता दिखा रहे हैं।
याद रखें कि आप जिस डेकोरेटर का मजाक उड़ा रहे हैं, वह इस बात पर आधारित है कि आपका मॉड्यूल डेकोरेटर को कैसे लोड करता है, न कि यह कि कैसे आपका टेस्ट डेकोरेटर को लोड करता है। यही कारण है कि मैं हमेशा आयात के लिए पूर्ण पथ का उपयोग करने का सुझाव देता हूं। यह चीजों को परीक्षण के लिए बहुत आसान बनाता है।
कदम:
1.) नकली समारोह:
from functools import wraps
def mock_decorator(*args, **kwargs):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
return f(*args, **kwargs)
return decorated_function
return decorator
2.) सजावट करने वाले का मजाक उड़ाना:
2a।) पथ अंदर से।
with mock.patch('path.to.my.decorator', mock_decorator):
from mymodule import myfunction
2 बी।) फ़ाइल के शीर्ष पर, या TestCase.setUp में पैच
mock.patch('path.to.my.decorator', mock_decorator).start()
इनमें से कोई भी तरीका आपको टेस्टकेस या इसके तरीके / परीक्षण मामलों में किसी भी समय अपने फ़ंक्शन को आयात करने की अनुमति देगा।
from mymodule import myfunction
2.) mock.patch के साइड इफेक्ट के रूप में एक अलग फ़ंक्शन का उपयोग करें।
अब आप प्रत्येक डेकोरेटर के लिए mock_decorator का उपयोग कर सकते हैं जिसे आप मॉक करना चाहते हैं। आपको प्रत्येक डेकोरेटर को अलग से मॉक करना होगा, इसलिए जो आप याद करते हैं, उसे देखें।