2015-04-10 9 views
10

से मेल खाती है तो मूल कार्य को कॉल करें मैं सशर्त रूप से नकली विधि को नकली में कैसे कॉल कर सकता हूं?सशर्त मॉकिंग: यदि स्थिति

इस उदाहरण में मैं केवल bar=='x' पर वापसी मूल्य चाहता हूं। अन्यथा मैं मूल विधि को कॉल करना चाहता हूं।

def mocked_some_method(bar): 
    if bar=='x': 
     return 'fake' 
    return some_how_call_original_method(bar) 

with mock.patch('mylib.foo.some_method', mocked_some_method): 
    do_some_stuff() 

मुझे पता है कि यह थोड़ा अजीब है। अगर मैं नकली mylib.foo.some_method पक्ष do_some_stuff() में चाहता हूं तो यह स्थिति-कम होना चाहिए। some_method पर सभी (कुछ नहीं) कॉल मॉक किए जाने चाहिए।

मेरे मामले में यह एकीकरण परीक्षण है, न कि एक छोटे से छोटे और mylib.foo.some_method एक प्रकार का प्रेषक है जो अक्सर उपयोग किया जाता है। और एक मामले में मुझे परिणाम नकली करने की जरूरत है।

उत्तर

12

यदि आपको नकली कॉल की देखभाल किए बिना व्यवहार को प्रतिस्थापित करने की आवश्यकता है तो कार्य करें आप new तर्क का उपयोग कर सकते हैं; अन्यथा आप side_effect का उपयोग कर सकते हैं जो कॉल करने योग्य है।

मुझे लगता है कि some_method एक ऑब्जेक्ट विधि है (staticmethod के बजाय) तो आपको इसे कॉल करने के लिए इसके ऑब्जेक्ट को संदर्भित करने की आवश्यकता है। side_effect मामले के लिए सही हस्ताक्षर का उपयोग करने के लिए आपके रैपर को ऑब्जेक्ट के पहले तर्क के रूप में घोषित करना चाहिए और आपके पैच autospec=True का उपयोग करें।

अंतिम चाल मूल विधि संदर्भ को सहेजती है और कॉल करने के लिए इसका उपयोग करती है।

orig = mylib.foo.some_method 
def mocked_some_method(self, bar): 
    if bar=='x': 
     return 'fake' 
    return orig(self, bar) 

#Just replace: 
with mock.patch('mylib.foo.some_method', new=mocked_some_method): 
    do_some_stuff() 

#Replace by mock 
with mock.patch('mylib.foo.some_method', side_effect=mocked_some_method, autospec=True) as mock_some_method: 
    do_some_stuff() 
    assert mock_some_method.called 
+0

"स्थैतिक" के साथ आपका क्या मतलब है: "मुझे लगता है कि कुछ_method स्थिर नहीं है ..."? – guettli

+0

आप सही हैं। रैपर के रूप में नकली सबसे अच्छा अभ्यास नहीं है। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न अपडेट किया। – guettli

+0

@guettli आपके प्रश्न से मैं अनुमान लगा सकता हूं कि 'some_method' 'staticmethod' नहीं है लेकिन एक ऑब्जेक्ट विधि है .... मैं साइड नोट को हटाकर अपना जवाब बदल दूंगा लेकिन यह आपकी आवश्यकताओं को पहले से ही फिट कर सकता है। –

संबंधित मुद्दे