2011-08-09 20 views
20

राइनोमोक्स का उपयोग करके, मैं किसी संपत्ति के गेटर मूल्य को रोकने की कोशिश कर रहा हूं। संपत्ति को केवल इंटरफ़ेस के हिस्से के रूप में परिभाषित किया जाता है जिसमें केवल गेटर पहुंच होती है।एक संपत्ति को रगड़ना राइनो मोक्स का उपयोग कर

हालांकि मुझे त्रुटि मिलती है "अमान्य कॉल, अंतिम कॉल का उपयोग किया गया है या कोई कॉल नहीं किया गया है (सुनिश्चित करें कि आप वर्चुअल (सी #)/ओवरड्रेबल (वीबी) विधि को कॉल कर रहे हैं)।" मैं समझता हूं कि इसका मतलब यह हो सकता है कि मैं जिस संपत्ति को दबा रहा हूं वह आभासी नहीं है; हालांकि यह इंटरफ़ेस का हिस्सा है और मुझे यकीन नहीं है कि यही कारण है कि मुझे यह त्रुटि क्यों मिलती है ..

नीचे कोड कंकाल है। यदि मैं "stubRepository.Stub (x => x.StoreDeviceID) कहता हूं, तो लाइन को अपूर्ण करता हूं .प्रॉपर्टीबिनेयर();", तो मुझे एक नई त्रुटि मिलती है "संपत्ति को पढ़ना/लिखना चाहिए"। मैंने एसओ पर खोज की और this पृष्ठ मिला। लेकिन प्रस्तावित समाधान मेरी मदद नहीं करता है। कोई विचार?

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 
आम तौर पर स्टब्स साथ

, गुण सामान्य सी # गुण की तरह इस्तेमाल कर रहे हैं:

public interface IStore { 
     string StoreDeviceID {get;} 
     //other methods 
    } 

    public static class Store { 
     private IStore Repository; 

     public void SetRepository(IStore rep){ 
      Repository = rep; 
     } 

     public StoredeviceID { 
      get{ 
       return Repository.StoreDeviceID; 
      } 
     } 

     //other methods 
    } 

    public class TestClass { 
     [Test] 
     public void TestDeviceID() { 
      var stubRepository = 
       MockRepository.GenerateStub<IStore>(); 
      Store.SetRepository(stubRepository); 

      //stubRepository.Stub(x => x.StoreDeviceID).PropertyBehavior(); 
      SetupResult.For(stubRepository.StoreDeviceID).Return("test"); 

      Assert.AreSame(Store.StoreDeviceID, "test"); 
     } 
    } 

उत्तर

28

चूंकि यह एक केवल पढ़ने के लिए संपत्ति है, तो आप कहने के लिए की जरूरत है। तो गैर केवल पढ़ने के लिए गुणों के लिए, आप कह सकते हैं कि: stubRepository.someProperty = "test";

यह भी ध्यान रखें कि यदि आप एक निश्चित तरीके से व्यवहार करने के लिए, चाहे वह एक नकली या एक ठूंठ है की परवाह किए बिना एक विधि की स्थापना करना चाहता था, तो आप हमेशा कहते थे:

stubRepository.Stub(x => x.someMethod()).Return("foo"); 

याद रखें, स्टब्स वहाँ उनकी जरूरत निर्भरता के साथ अपने इकाई परीक्षण की आपूर्ति करने हैं, लेकिन नहीं वहाँ पर सत्यापन को चलाने के लिए कर रहे हैं; यही मोक्स के लिए हैं।

जब आप एक निर्भरता की आपूर्ति करना चाहते हैं तो एक स्टब का उपयोग करें जो एक निश्चित तरीके से व्यवहार करता है। जब आप यह सत्यापित करना चाहते हैं कि एक निश्चित निर्भरता को सही ढंग से बातचीत की गई है तो एक मॉक का उपयोग करें।

(बकाया) से Rhino Wiki:

A mock is an object that we can set expectations on, and which will verify that the expected actions have indeed occurred. A stub is an object that you use in order to pass to the code under test. You can setup expectations on it, so it would act in certain ways, but those expectations will never be verified. A stub's properties will automatically behave like normal properties, and you can't set expectations on them.

If you want to verify the behavior of the code under test, you will use a mock with the appropriate expectation, and verify that. If you want just to pass a value that may need to act in a certain way, but isn't the focus of this test, you will use a stub.

IMPORTANT: A stub will never cause a test to fail.

+0

@ एडम, चूंकि संपत्ति पूरी तरह से पढ़ी जाती है, इसलिए मैं इसे सेट नहीं कर सकता। हालांकि, संपत्ति को स्टब करने के लिए प्रदान किया गया कोड स्निपेट पूरी तरह से काम करता है। मुझे मूर्खतापूर्ण, मैंने इसे छोड़कर अन्य सभी विकल्पों की कोशिश की :) – Santhosh

+0

StoreDeviceID में कोई सेटटर नहीं है, इसलिए आपका पहला कथन 'stubRepository.StoreDeviceID =" test ";' काम नहीं करेगा। –

+0

आह - क्षमा करें। मैं अपना जवाब अपडेट करूंगा - खुशी है कि आपको यह काम मिल रहा है। –

4

आप एक ठूंठ के साथ निम्न कर सकते हैं:

stubRepository.Stub(x => x.StoreDeviceID).Return("test"); 

यह StoreDeviceID के गेटर के लिए किसी भी कॉल के लिए "परीक्षण" वापस जाने के लिए कारण होगा।

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