2012-03-26 11 views
5

मैं कक्षा की एक विशेष विधि का नकल करना चाहता हूं, समस्या का सामना करना पड़ रहा है, जबकि क्लास में कोई इंटरफ़ेस नहीं है और यह विधि वर्चुअल नहीं है।मॉकिंग क्लासेस जिनमें इंटरफ़ेस नहीं है और यहां तक ​​कि कोई वर्चुअल विधियां नहीं हैं

कोई भी मॉकिंग लागू करने का कोई अन्य तरीका सुझा सकता है।

किसी भी मदद की सराहना की जाएगी। अग्रिम धन्यवाद

उत्तर

3

मैं अपने कोड पुनर्रचना सुझाव देते हैं; सभी मजाक चौखटे जो मज़ाक उड़ाया वर्ग से पाने से नकली बनाता है) (यह मजाक ढांचे के बजाय अधिक CLR आवश्यकता है) आभासी होने के लिए तरीकों की आवश्यकता है।

गैर आभासी तरीकों आप मोल्स या TypeMock अलगाने की तरह प्रोफाइलर आधारित चौखटे का उपयोग कर सकते नकली करने के लिए, लेकिन इस

3

यूनिट परीक्षण फ्रेमवर्क जैसे TypeMock Isolator हैं जो आपको गैर वर्चुअल सदस्यों का नकल करने की अनुमति देते हैं।

+0

एक विकल्प (हालांकि कॉमर्सियल) [जस्टमैक] है (http://www.telerik.com/products/mocking.aspx)। –

6

विकल्प 1: TypeMock Isolator या कुछ ऐसा ही है, जो सामान्य मॉकिंग से कोड के साथ गहरे गड़बड़ की अनुमति देता है।

विकल्प 2: (यदि संभव हो तो पसंदीदा) डिजाइन को बदलें, उदा। एक इंटरफ़ेस पेश करके और एक प्रतिनिधि कार्यान्वयन बनाकर जो केवल मौजूदा परीक्षण-असभ्य वर्ग में कॉल करता है। फिर आप इंटरफ़ेस पर निर्भर कर सकते हैं, इसे परीक्षण में नकल कर सकते हैं, और उत्पादन के लिए "असली" कार्यान्वयन के लिए प्रतिनिधि हो सकते हैं।

यह मानता है कि आप वास्तव में कक्षा का मज़ाक उड़ा रहे हैं। आपको सब कुछ स्वचालित रूप से नकल नहीं करना चाहिए आपका कोड उपयोग करता है - मुझे कुछ विवरणों की "सेवाओं" का मज़ाक उड़ाते हुए लगता है, जबकि मैं नकल नहीं करता (उदाहरण के लिए) List<T>

+0

@Downvoter: टिप्पणी करने की देखभाल? –

+0

विकल्प 1 के साथ क्या समस्या है? यह एक गैर-खुला स्रोत उपकरण है? या यह * माना जाता है * बुरा कोड/डिजाइन का नेतृत्व करेंगे? किसी भी उपकरण का दुरुपयोग किया जा सकता है, और हमेशा * एक * या दूसरे तरीके से होता है, यहां तक ​​कि अधिक पारंपरिक मॉकिंग टूल भी होते हैं जिनके साथ लोग अक्सर "गेटर्स" का मज़ाक उड़ाते हैं। "एक इंटरफ़ेस पेश करके और प्रतिनिधिमंडल कार्यान्वयन करके डिज़ाइन को बदलें" मेरी (पक्षपातपूर्ण) राय में खराब कोड का कारण बनने की संभावना है। –

+0

क्षमा करें, मुझे * टिप्पणी के बाद * डाउनवॉट किया जाना चाहिए ... –

1

विशुद्ध रूप से एक विरासत बाहर नकली करने के लिए कार्रवाई करने के लिए विशेष धावक जो CLR प्रोफाइलर जोड़ देती है का उपयोग कर परीक्षण धावक को चलाने के लिए की आवश्यकता है कक्षा मैं निम्न कार्य करता हूं:

  1. केवल एक ऐसे इंटरफ़ेस बनाएं जिसमें मैं उपयोग करने का इरादा रखता हूं। उदाहरण के लिए। लक्ष्य विरासत वर्ग बंद है

    public interface IDbContext { 
        int SaveChanges(); 
    } 
    
  2. तो मैं एक प्रॉक्सी/डेकोरेटर वर्ग जो नए इंटरफ़ेस लागू करता है और सिर्फ अंतर्निहित तरीकों/गुण लागू बनाएंगे।

    public class MyDbContextProxy : IDbContext { 
        DbContext _context = null; 
        public MyDbContextProxy(DbContext interceptedContext) { 
         _context = interceptedContext; 
        } 
        // decorated method 
        public int SaveChanges() { 
         _context.SaveChanges(); 
        } 
    } 
    
  3. लक्ष्य विरासत वर्ग सील नहीं है, तो मैं लक्ष्य का वंशज बना सकते हैं और इंटरफ़ेस को लागू होगी। कक्षा ऑटो इंटरफेस का पालन करता है।

    public class MyDbContextProxy : DbContext, IDbContext { 
        // child adheres to interface by inheritence 
    } 
    

अब आप IDbContext बाहर नकली कर सकते हैं।

1

अभी वीएस2012 में नकली फ्रेमवर्क की तरह कुछ है। यह मोल्स का उत्तराधिकारी है (टाइपमॉक जैसे कक्षाएं आदि करने में भी सक्षम है)। यह केवल अल्टीमेट संस्करण में उपलब्ध है, इसलिए मुझे यह नहीं लगता कि यह अल्टीमेट की कीमत के लायक है।

लेकिन, मैं अन्य परिप्रेक्ष्य से कक्षाओं के मज़ाक के साथ समस्या पर चर्चा करना चाहता हूं।

क्या यह इंटरफेस के बजाय कक्षाओं के नकली कक्षाओं के लिए एक अच्छा तरीका है या यह किसी प्रकार की बुरी गंध है? मैंने टाइपमॉक का कभी भी उपयोग नहीं किया है (यह छोटी कंपनी में भी विचार करना बहुत महंगा है), लेकिन लोग दावा करते हैं कि यह थोड़ा "बहुत शक्तिशाली" है इसलिए मैं मोक/राइनोमोक्स का उपयोग करना चाहता हूं, लेकिन कभी-कभी मैं नकली/नकली बनाना चाहता हूं एक विधि और दूसरों को छोड़ दें। परीक्षणों के दौरान नकली/नकली विधियों के बारे में सोचने का यह मेरा बुरा तरीका है? या कभी-कभी इसकी आवश्यकता होती है?

+0

नकली ढांचे के लिए देर से +1 :) – mnkypete

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