2012-02-05 13 views
9

यूनिट-परीक्षणों को कार्यक्षमता का परीक्षण करना चाहिए और कार्यान्वयन विवरणों के लिए अज्ञेयवादी होने का प्रयास करना चाहिए। Mock.assert_called_with() एक सुविधाजनक कार्य है, फिर भी AFAIK यह *args से *args और **kwargs से **kwargs की तुलना करता है। इसलिए:Mock.assert_called_with() agnostic args बनाम kwargs

# class to be mocked during test 
class SomeClass(): 
    def func(self,a,b,c=5): 
     # ... 

# code under test 
somaclass_instance.func(1,b=2,c=3) 

# test code that works 
someclass_mock.func.assert_called_with(1,b=2,c=3) 

# test code that won't work 
someclass_mock.func.assert_called_with(1,2,c=3) 
someclass_mock.func.assert_called_with(a=1,b=2,c=3) 

वहाँ इतना है कि बारीकियों जो *args की जहां func करने के लिए कॉल, जो वास्तव में एक कार्यान्वयन विस्तार है में **kwargs रूप में इस्तेमाल किया, ध्यान नहीं दिया जाएगा इस सामान्यीकरण करने के लिए एक तरीका है?

+0

मुझे 100% यकीन नहीं है कि मैं आपका प्रश्न समझता हूं, लेकिन आप एक ही फ़ंक्शन कॉल में * args और ** kwargs पास कर सकते हैं, या चूंकि तर्क प्रकार के tuple हैं, और kwargs dicts हैं, हो सकता है कि आप हो एक रैपर फ़ंक्शन लिखने में सक्षम है जो इनपुट को सामान्य करता है जिसे आप सुनिश्चित कर सकते हैं। –

+1

क्या अब तक कोई नकली ढांचा है जो यह करता है? मेरे परीक्षण सिर्फ इसलिए विफल नहीं होना चाहिए क्योंकि किसी ने किसी बिंदु पर किसी कीवर्ड तर्क में स्थितित्मक तर्क बदलने का निर्णय लिया है। हालांकि, यह प्रश्न एकमात्र समय है जिसे मैंने कभी भी इस मुद्दे का उल्लेख किया है। मॉक पहले से ही स्पेस-ऑब्जेक्ट्स का समर्थन करता है, इसलिए यह संभव होना चाहिए? – jan

उत्तर

5

नकली करने के लिए एक सुविधा अनुरोध फ़ाइल करें।

मौलिक समस्या वास्तविक कार्य करने के लिए उपयोग के बिना/वर्ग नकली कीवर्ड बहस के क्रम जानने का कोई तरीका नहीं है, कि आमंत्रण call(a=1, b=2) और call(b=2, a=1), उपहास करने के लिए समान लग रही है, जबकि आमंत्रण call(1, 2) और call(2, 1) नहीं है।

amock.afunc.assert_called_with(1, 2, c=3, __prototype__=lambda a=None, b=None, c=None: None) 
1

अजगर 3.4 के बाद से, ठीक वैसे ही जैसा आप चाहते थे, विशिष्ट कॉल हस्ताक्षर के लिए जोर देते हुए:

आप नकली सामान्यीकरण करने के लिए चाहते हैं, तो आप एक कॉल प्रोटोटाइप या प्रोटोटाइप के एवज में एक समारोह है, जैसे पारित करने के लिए की आवश्यकता होगी एक कॉल करने योग्य मॉक एक spec के साथ बनाया गया है, और ऑटो-speccing का उपयोग करते समय ऑब्जेक्ट विधियों के लिए स्वचालित रूप से सामान्यीकृत किया जाता है।

the documentation of the Mock class के अंत से:

एक प्रतिदेय नकली जो एक कल्पना (या एक spec_set) के साथ बनाया गया था जब नकली के लिए कॉल मिलान विनिर्देश वस्तु के हस्ताक्षर आत्मनिरीक्षण करेंगे। इसलिए, यह वास्तविक कॉल के तर्कों से मिलान कर सकते कि क्या वे positionally पारित कर दिया गया हो या नाम से:) assert_called_once_with(), assert_has_calls() और assert_any_call

>>> def f(a, b, c): pass 
... 
>>> mock = Mock(spec=f) 
>>> mock(1, 2, c=3) 
<Mock name='mock()' id='140161580456576'> 
>>> mock.assert_called_with(1, 2, 3) 
>>> mock.assert_called_with(a=1, b=2, c=3) 

यह assert_called_with करने के लिए (लागू होता है,()। जब ऑटोस्पेकिंग, यह भी नकली ऑब्जेक्ट पर विधि कॉल पर लागू होगा।

संस्करण 3.4 में बदल गया: specced और autospecced नकली वस्तुओं पर हस्ताक्षर आत्मनिरीक्षण जोड़ा गया।

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