2010-03-17 11 views
30

मैं मोक में यह कैसे कर सकता हूं?Moq के साथ एक ठोस वस्तु पर फ़ंक्शन कॉल का नकल कैसे करें?

Foo bar = new Foo(); 
Fake(bar.PrivateGetter).Return('whatever value') 

ऐसा लगता है कि मैं केवल ढांचे के माध्यम से बनाई गई वस्तु को नकल करने का तरीका ढूंढ सकता हूं। मैं अपने द्वारा बनाई गई ठोस वस्तु पर केवल एक ही विधि/संपत्ति का नकल करना चाहता हूं।

टाइपमॉक में, मैं बस Isolate.WhenCalled(bar.PrivateGetter).Returns('whatever value') करता हूं।

कोई विचार?

उत्तर

13

केवल टाइपमॉक आइसोलेटर (और शायद मोल्स) इन स्टंटों को निष्पादित कर सकते हैं। सामान्य गतिशील नकली पुस्तकालय only mock virtual and abstract members कर सकते हैं।

+0

जानना अच्छा है - वहां वहां मोल्स पर अधिक जानकारी थी - अभी तक इस पर कुछ भी नहीं सुना है, जहां तक ​​लोग इसका उपयोग SO – dferraro

+0

FWIW पर यहां करते हैं, यहां आधिकारिक साइट है: http: // research। microsoft.com/en-us/projects/moles/ –

+0

वह मोक ऐसा नहीं कर सकता है यह अब और सत्य नहीं है। – MushinNoShin

51

आपको मॉक ऑब्जेक्ट बनाने के लिए Moq का उपयोग करना चाहिए और ऑब्जेक्ट व्यवहार का उपयोग करने के लिए कॉलबेस संपत्ति को सही पर सेट करना चाहिए।

Moq प्रलेखन से: कॉलबेस को "क्लास क्लास कार्यान्वयन को आमंत्रित करें" यदि कोई उम्मीद सदस्य को ओवरराइड नहीं करती है। इसे "आंशिक मॉक" कहा जाता है। यह सबकुछ नकल किए बिना कक्षा के कुछ हिस्से को नकल करने की अनुमति देता है।

नमूना कोड:

[Test] 
    public void FailintgTest() 
    { 
     var mock = new Moq.Mock<MyClass>(); 
     mock.Setup(m => m.Number).Returns(4); 
     var testObject = mock.Object; 
     Assert.That(testObject.Number, Is.EqualTo(4)); 
     Assert.That(testObject.Name, Is.EqualTo("MyClass")); 
    } 

    [Test] 
    public void OKTest() 
    { 
     var mock = new Moq.Mock<MyClass>(); 
     mock.Setup(m => m.Number).Returns(4); 
     mock.CallBase = true; 
     var testObject = mock.Object; 
     Assert.That(testObject.Number, Is.EqualTo(4)); 
     Assert.That(testObject.Name, Is.EqualTo("MyClass")); 
    } 

    public class MyClass 
    { 
     public virtual string Name { get { return "MyClass"; } } 

     public virtual int Number { get { return 2; } } 
    } 
+0

धन्यवाद, मैं इसे आजमाउंगा। TypeMock हालांकि अधिक से अधिक आकर्षक लग रहा है। ओह! – dferraro

+1

यह काम नहीं करता - इसने mock.Setup() लाइन (दूसरे उदाहरण में) पर त्रुटि संदेश दिया "टेस्ट विधि CRMFundOfFundPluginsUnitTest.FoFPluginBaseTest.SetMissingTargetValuesTest1 अपवाद फेंक दिया: System.ArgumentException: एक गैर-अतिसंवेदनशील सदस्य पर अमान्य सेटअप: मीटर => एम। इनपुट लक्ष्य लक्ष्य। "। कोई विचार क्यों? – dferraro

+6

सुनिश्चित करें कि जिन तरीकों का आप मजाक कर रहे हैं वे आभासी हैं इसलिए मक उन्हें ओवरराइड करने में सक्षम होंगे। –

3

Moles भी रूप में लंबे समय के रूप में हस्ताक्षर पर प्रकार दिखाई दे रहे हैं निजी तरीकों की जगह ले सकता। इस मामले में इसलिए, यह इस तरह दिखेगा:

MFoo bar = new MFoo { // instantiate the mole of 'Foo' 
    PrivateGetterGet =() => "whatever value" // replace PrivateGetter {get;} 
}; 
Foo realBar = bar; // retrive the runtime instance 
... 

आप मोल्स बारे में अधिक जानकारी के लिए देख रहे हैं, http://research.microsoft.com/en-us/projects/pex/documentation.aspx पर ट्यूटोरियल के साथ शुरू करते हैं।

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