2009-04-20 16 views
57

मैं एक वापसी मान स्थापित करने के लिएकिसी ऑब्जेक्ट पर पिछली उम्मीदों को कैसे साफ़ किया जाए?

_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(true); 

लेकिन फिर एक विशेष परीक्षा में, उस उम्मीद को ओवरराइड झूठी वापसी करना चाहते हैं।

कुछ की तरह:

_stubRepository.ClearExpectations(); //<- this does not exist, I'm just making something up 
_stubRepository.Stub(Contains(null)).IgnoreArguments().Return(false); 

सूचना, मैं उम्मीद दूसरी कॉल पर झूठी वापस जाने के लिए नहीं करना चाहते, मैं पहली बार उम्मीद ओवरराइड करना चाहते।

इससे मेरे परीक्षण परिदृश्य को काफी सरल बनाने में मदद मिलेगी। BackToRecord

का उपयोग कर रहा स्वीकार करने के लिए है कि मैं वास्तव में कभी नहीं यह प्रयोग किया जाता है क्योंकि यह अजीब है द्वारा

आप उम्मीदों रीसेट कर सकते हैं:

उत्तर

67

वहाँ तीन तरीके हैं।

// clear expectations, an enum defines which 
_stubRepository.BackToRecord(BackToRecordOptions.All); 
// go to replay again. 
_stubRepository.Replay(); 

संपादित करें: अब मैं यह कभी कभी का उपयोग करें, यह वास्तव में स्पष्ट तरीका है। एक विस्तार विधि (स्टब की तरह) होनी चाहिए जो यह करता है - मुझे लगता है कि यह अभी भूल गया है। मैं अपना खुद का लिखने का सुझाव दूंगा।

आप Repeat.Any उपयोग कर सकते हैं()

यह टूट जाता है 'टोंटदार परिभाषा के आदेश और "ओवरराइड" पिछले परिभाषाओं। लेकिन यह किसी भी तरह से निहित है। मैं इसे कभी-कभी उपयोग करता हूं क्योंकि इसे लिखना आसान है।

_stubRepository.Stub(x => x.Contains(null)) 
    .IgnoreArguments() 
    .Return(false) 
    .Repeat.Any(); 

आप एक नया नकली

तुच्छ बना सकते हैं, लेकिन स्पष्ट और आसान समझने के लिए। यह केवल एक समस्या है यदि आप बहुत सारी परिभाषाएं रखना चाहते हैं और केवल एक कॉल बदलना चाहते हैं।

_stubRepository = MockRepository.GenerateMock<IRepository>(); 
_stubRepository.Stub(x => x.Contains(null)) 
    .IgnoreArguments() 
    .Return(false); 
+0

आंतरिक राइनो मॉक में दोहराने का उपयोग करते हुए बोलते हैं। कोई भी दोहराने योग्य उम्मीद बनाता है, जो प्लेबैक के दौरान सामान्य अपेक्षाओं को टंप करता है। मैं बैकट्रो रिकार्ड का उपयोग करने की सलाह देता हूं, हालांकि। –

+0

आह, रीप्ले() कॉल को छोड़कर इसे सब कुछ पता चला। –

+1

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

22

इन स्थितियों के लिए, मैं बेहतर ठूंठ की मंशा दिखाने के लिए और पठनीयता को बढ़ावा देने के लिए एक सरल RinoMocks विस्तार विधि बनाया।

public static void OverridePrevious<T>(this IMethodOptions<T> options) 
{ 
    options.Repeat.Any(); 
} 

तो बजाय निम्नलिखित की तरह एक गुप्त कॉल कि एक टिप्पणी की आवश्यकता हो सकती:

[SetUp] 
public void Setup() 
{ 
    carStub.Stub(x => x.Model).Return("Model1"); 
    carStub.Stub(x => x.Model).Return("Model2"); 
} 

[Test] 
public void SomeTest() 
{ 
    //Arrange 
    //overrides previous stubs that were setup for the Model property 
    carStub.Stub(x => x.Model).Return(null).Repeat.Any(); 

    //Act 
    //Assert 
} 

आप एक अधिक पठनीय परीक्षण प्राप्त कर सकते हैं कि बेहतर शो .Repeat.Any के इरादे() कॉल :

carStub.Stub(x => x.Model).Return(null).OverridePrevious(); 
+5

स्टब कॉन्फ़िगरेशन चेन करने के लिए विकल्प को खोलने के लिए, एक्सटेंशन विधि को IMethodOptions वापस नहीं करना चाहिए? 'सार्वजनिक स्थैतिक IMethodOptions ओवरराइड पूर्व (यह IMethodOptions विकल्प) {वापसी विकल्प। दोहराना। कोई भी(); } '। – PHeiberg

+2

@PHeiberg - मैंने कोशिश नहीं की है या 'चेन ओपन' रखने की आवश्यकता है लेकिन हाँ मुझे लगता है कि आप सही हैं। अच्छी बात। – MoMo

+0

मुझे ओवरराइड पसंद है जैसे शून्य - यह इसे अंत तक मजबूर करता है। – user2864740

5

मैं ऊपर विकल्पों में से स्टीफन की सूची में जोड़ने के लिए इस जोड़ देंगे समुदाय की खातिर:

यदि वापसी मूल्य को अक्सर बदला जाना आवश्यक है, तो मुझे निम्नानुसार बंद करने का उपयोग करने के लिए यह साफ और कुशल लगता है।

bool returnValue = true; 
_stubRepository.Stub(x => x.Contains(null)).IgnoreArguments().Do(new Func<bool>(() => { 
    return returnValue; 
})); 

returnValue = false; 
// Calls to Contains now return false; 

returnValue = true; 
// Calls to Contains now return true; 

लैम्ब्डा अभिव्यक्ति हर बार Contains कहा जाता है निष्पादित किया जाएगा और क्योंकि हम एक बंद returnValue संदर्भित बनाई गई है, यह हमेशा returnValue की वर्तमान मूल्य को दिखेगा।

+0

यह मेरी राय में सबसे साफ समाधान है –

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