2009-12-28 7 views
8

क्या किसी ऑब्जेक्ट को मॉक करने के लिए Moq का उपयोग करना संभव है जो एक इंटरफ़ेस और अमूर्त वर्ग लागू करता है?क्या आप ऐसी वस्तु का नकल कर सकते हैं जो एक इंटरफेस और एक अमूर्त वर्ग लागू करता है?

यानी .:

public class MyClass: SomeAbstractClass, IMyClass 

आप इस नकली कर सकते हैं?

उत्तर

5

आप किसी भी इंटरफेस, और किसी भी सार या आभासी सदस्यों का नकल कर सकते हैं। यह मूल रूप से यह है। आप भी कर सकते हैं,

var imock = new Mock<IMyClass>(); 
var aMock = new Mock<SomeAbstractClass>(); 

सदस्यों SomeAbstractClass से विरासत में मिली सील नहीं कर रहे हैं नकली MyClass:

इसका मतलब है कि निम्नलिखित बिल्कुल संभव हो रहे हैं

var mcMock = new Mock<MyClass>(); 

इस अर्थ या नहीं बनाता है या नहीं MyClass के कार्यान्वयन पर निर्भर करता है। मान लीजिए कि SomeAbstractClass इस तरह परिभाषित किया गया है दो:

public abstract class SomeAbstractClass 
{ 
    public abstract string GetStuff(); 
} 

MyClass में GetStuff विधि इस तरह कार्यान्वित किया जाता है, तो आप अभी भी यह ओवरराइड कर सकते हैं:

:

public override string GetStuff() 
{ 
    return "Foo"; 
} 

यह आपको लिखने के लिए अनुमति होगी

mcMock.Setup(x => x.GetStuff()).Returns("Bar"); 

जब तक स्पष्ट रूप से मुहरबंद नहीं किया जाता है, GetStuff अभी भी वर्चुअल है। हालांकि, आपने इस तरह गेटस्टफ लिखा था:

public override sealed string GetStuff() 
{ 
    return "Baz"; 
} 

आप इसे नकल करने में सक्षम नहीं होंगे। उस स्थिति में, आपको मोक से अपवाद मिलेगा कि यह एक गैर-वर्चुअल सदस्य का अमान्य ओवरराइड है (क्योंकि अब यह sealed है)।

0

आपका प्रश्न वास्तव में समझ में नहीं आता है। अमोक वर्गों और इंटरफेस का मज़ाक उड़ाने के लिए मोक का उपयोग किया जा सकता है। चूंकि MyClass न तो तब आप इसका मजाक नहीं बना सकते हैं। मुझे नहीं लगता कि यह एक समस्या है, क्योंकि आपके माइक्लास उदाहरण के उपभोक्ता शायद SomeAbstractClass या IMyClass इंस्टेंस की अपेक्षा करेंगे और MyClass उदाहरण नहीं होंगे। यदि वास्तव में वे MyClass उदाहरण की अपेक्षा करते हैं, तो आपको इसके शीर्ष पर कुछ अमूर्तता बनाने की आवश्यकता है। यह SomeAbstractClassIMyClass इंटरफ़ेस को कार्यान्वित करके या IMyClass इंटरफेस को SomeAbstractClass के तरीकों और गुणों का खुलासा करके प्राप्त किया जा सकता है।

+1

मुझे लगता है कि उनके प्रश्न को यह समझ में आया कि वह पूछताछ कर रहा था * समकक्ष * MyClass ऑब्जेक्ट को अपने प्रश्न –

+0

नहीं, क्योंकि उस मामले में सही सवाल होना चाहिए था: क्या मैं किसी भी ठोस वर्ग का नकल करने के लिए मोक का उपयोग कर सकता हूं ? जवाब बस नहीं रहा होगा। जहां तक ​​मुझे पता है कि राइनो मोक्स हालांकि ऐसा कर सकते हैं। –

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