2009-02-12 15 views
46

का उपयोग कर स्टेटिक विधियों का मज़ाक उड़ा रहा है क्या Rhino.Mocks का उपयोग करके एक स्थिर विधि का नकल करना संभव है? यदि राइनो इसका समर्थन नहीं करता है, तो क्या कोई पैटर्न या कुछ ऐसा है जो मुझे पूरा करने देगा?Rhino.Mocks

उत्तर

70

तो वह एक स्थिर विधि उपहास करने के लिए संभव Rhino.Mocks

का उपयोग कर नहीं, यह संभव नहीं है है।

टाइपमैक ऐसा कर सकता है क्योंकि यह कॉल को अवरुद्ध करने और पुनर्निर्देशित करने के लिए सीएलआर प्रोफाइलर का उपयोग करता है।

राइनोमोक्स, एनएमॉक, और मोक ऐसा नहीं कर सकते क्योंकि ये पुस्तकालय सरल हैं; वे सीएलआर प्रोफाइलर एपीआई का उपयोग नहीं करते हैं। वे सरल हैं कि वे आभासी सदस्यों और इंटरफेस कॉल को रोकने के लिए प्रॉक्सी का उपयोग करते हैं। इस सादगी का नकारात्मक पक्ष यह है कि वे स्थिर चीजों, स्थिर गुणों, मुहरबंद वर्गों, या गैर-आभासी उदाहरण विधियों जैसे कुछ चीजों का नकल नहीं कर सकते हैं।

21

किसी अन्य वर्ग में वर्चुअल इंस्टेंस विधि में स्थिर विधि कॉल को लपेटें, फिर उस पर ध्यान दें।

+1

मेरे लिए सबसे अच्छा कामकाज, लेकिन जल्द या बाद में कोड इस fasades के cuz बढ़ाया जाता है। –

4

एकमात्र नकली ढांचा जो मुझे पता है कि मॉकिंग स्टेटिक्स का समर्थन करता है TypeMock है।

जैसा कि Rytmis ने सुझाव दिया है, आपको किसी चीज में स्थिरता को लपेटने की आवश्यकता है (यानी वर्चुअल विधियों या इंटरफेस के साथ एक इंस्टेंस क्लास) जिसे आप मॉक आउट कर सकते हैं।

2

मैं moq का उपयोग करके मजाक कर रहा हूं, मुझे नहीं लगता कि हम इसका उपयोग कर स्थिर सदस्यों का नकल कर सकते हैं क्योंकि moQ लक्ष्य (कक्षा या इंटरफ़ेस) के लिए एक नई प्रॉक्सी बनाता है। तो केवल विरासत योग्य सदस्य (कक्षा के मामले में वर्चुअल, इंटरफ़ेस के मामले में सार्वजनिक) को मजाक किया जा सकता है। जाहिर है, स्थिर सदस्यों को विरासत में नहीं मिला है, इसलिए समस्या है।

4

यह राइनो मोक्स के लिए सबसे बड़ी कमी है। मुझे नहीं पता कि राइनो मोक्स के लिए यह भी संभव है कि इसे बिना किसी अवधारणा के लागू किया जाए कि यह कैसे मजाक कर रहा है।

15

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

class TypeToTest 
{ 
    public void Method() { } 
} 

interface ITypeToTest 
{ 
    void Method(); 
} 

class TypeToTestProxy : ITypeToTest 
{ 
    TypeToTest m_type = new TypeToTest(); 

    public void Method() { m_type.Method(); } 
} 

इस प्रॉक्सी बना कर आप अब एक ITypeToTest जहां से गुजर रहा है या एक TypeToTest उदाहरण स्थापित करने थे, सुनिश्चित करें कि डिफ़ॉल्ट कार्यान्वयन TypeToTestProxy का उपयोग करता है के रूप में यह वास्तविक कार्यान्वयन के लिए अग्रेषित करता है बनाने के स्थान पर उपयोग कर सकते हैं। फिर, आप अपने टेस्ट कोड में एक नकली ITypeToTest बना सकते हैं और तदनुसार अपेक्षाएं सेट कर सकते हैं।

ध्यान दें कि इन प्रॉक्सी बनाने से बहुत कठिन, त्रुटि-प्रवण और समय लेने वाला हो सकता है। इसे संबोधित करने के लिए मैं एक लाइब्रेरी और टूल का सेट बनाए रखता हूं जो आपके लिए इन प्रकारों वाली असेंबली उत्पन्न करता है। अधिक जानकारी के लिए कृपया this page देखें।

+0

मुझे लगता है कि दोनों प्रॉक्सी क्लास टाइपटॉस्ट और यह इंटरफ़ेस ITypeToTest राइनो मोक्स के लिए सार्वजनिक होना चाहिए –

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