2011-06-08 16 views
9

फेंकने के लिए मैं निम्नलिखित परीक्षण कोड है:राइनो मोक्स त्रुटि: पिछली विधि 'IENumerator.MoveNext();' एक वापसी मान या एक अपवाद की आवश्यकता है

parentViewModel = MockRepository.GenerateMock<IParentViewModel>(); 
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(new Milestone[0]); 

viewModel = new JobPenaltiesViewModel(j, new Penalty[0], _opContext, parentViewModel); 

Assert.That(viewModel.Milestones.Count(), Is.EqualTo(0)); 
parentViewModel.VerifyAllExpectations(); 

List<string> propsChanged = new List<string>(); 
viewModel.PropertyChanged += (s, e) => propsChanged.Add(e.PropertyName); 

parentViewModel.Raise(x => x.PropertyChanged += null, parentViewModel, new PropertyChangedEventArgs("JobMilestones")); 

AssertPropertiesChangedAsExepected(propsChanged, 1, "Milestones"); 

Milestone m1 = GenerateMilestone(j); 
List<Milestone> milestones1 = new List<Milestone> { m1 }; 
parentViewModel.Expect(x => x.GetPropertyValue<IEnumerable<Milestone>>("JobMilestones")).Return(milestones1).Repeat.Any(); 

IEnumerable<Milestone> milestones = viewModel.Milestones; 
Assert.That(milestones.Count(), Is.EqualTo(1)); 
parentViewModel.VerifyAllExpectations(); 

सभी परीक्षणों और कथनों तक सफल हो:

Assert.That(milestones.Count(), Is.EqualTo(1)); 

है वहीं मुझे अपवाद:

Previous method 'IEnumerator.MoveNext();' requires a return value or an exception to throw. 

मैंने जो कुछ भी सोच लिया है, मैंने कोशिश की है, और मेरा परीक्षण यह इंगित करता है कि पैरेंट व्यू मॉडेल मॉक शून्य या एक एमएम वापस आ रहा है पीटीई गणना (यानी जब मैं लौटा हुआ मूल्य का निरीक्षण करने के लिए डीबगर का उपयोग करता हूं तो 'परिणाम देखें' कहता है कि गणना ने कोई परिणाम नहीं दिया)।

मुझे यहां क्या याद आ रही है?

+1

यदि आप ऐसा करने का प्रयास करते हैं तो आपको सही परिणाम मिलते हैं: 'IENumerable मील का पत्थर = parentViewModel.Milestones;' और 'Assert.That (milestones.Count(), Is.EqualTo (1))'? (बस सत्यापित करें कि आपने एम 1 कहाँ खोला है) – steenhulthin

+1

नहीं, 'Assert.That (मील का पत्थर। काउंटर(), Is.EqualTo (1))' अपवाद का स्रोत है। मैं कभी भी 'parentViewModel.VerifyAllExpectations() ' – CodingGorilla

+1

पर नहीं जाता, ठीक है, मैं यह स्पष्ट नहीं था कि मेरा क्या मतलब था। मेरा मतलब था कि 'parentViewModel.Expect (x => x.GetPropertyValue > ("जॉबमिलेस्टोन") के बाद लाइनों को जोड़ना)। वापसी (मील का पत्थर 1)। दोहराएं।कोई भी(); 'इसलिए आप' viewModel' पर जोर देने से पहले 'parentViewModel' पर जोर देते हैं।' यह सत्यापित करने के लिए कि 'm1' 'parentViewModel.JobMileStones' में है (मैंने पहली टिप्पणी में parentViewModel.MileStones लिखा - मेरा बुरा।)। – steenhulthin

उत्तर

0

मैं के बाद से उल्लंघनकारी कोड निकाल दिए गए हैं; हालांकि मैंने कभी यह नहीं पता था कि यह किस तरह से व्यवहार कर रहा था।

2

milestones.Count() ऐसे ही निष्पादित हो रहा है (के रूप में इस एक IEnumerable वस्तु है):

  1. काउंटर सेट 0.
  2. को पहला तत्व प्राप्त करें।
  3. काउंटर में 1 जोड़ें।
  4. अगले तत्व पर जाएं।
  5. चरण 3 अगले तत्व जब तक अशक्त
  6. वापसी काउंटर

तो मैं सुझाव है कि आप कुछ नए सिरे से लिखना प्राप्त करने के लिए है।

विकल्प 1:

var milestones = viewModel.Milestones.ToArray();
//var milestones = viewModel.Milestones.ToList();

उसके बाद आप के लिए क्रमश: Count और Length संपत्ति का उपयोग कर सकते हैं:

  1. नहीं IEnumerable संग्रह है, लेकिन कुछ मजबूत वस्तु, List या Array की तरह बनाएं Assert चेक:

    Assert.That(milestones.Count, Is.EqualTo(1));
    //Assert.That(milestones.Length, Is.EqualTo(1));

  2. गिनती पैरामीटर स्टोर करने के लिए एक स्थानीय चर बनाएँ:

    var count = viewModel.Milestones.Count(); // .Count() method executes here. Assert.That(count, Is.EqualTo(1));

+1

मैं समझता हूं कि आप क्या कह रहे हैं, और यह कुछ समझ में आता है। लेकिन मेरे पास अभी भी सवाल यह है कि 'parentViewModel' को कॉल वास्तविक' सूची <> 'ऑब्जेक्ट लौटाया जाना चाहिए ('उम्मीद' कॉल पर ध्यान दें)। इसलिए 'गिनती()' को कॉल करने की भी आवश्यकता नहीं है, इसे सूची में गणना संपत्ति को कॉल करना चाहिए। यह लगभग है जैसे राइनोमोक्स रिटर्न वैल्यू दोबारा लिख ​​रहा है। – CodingGorilla

+1

@ कोडिंग गोरिल्ला मुझे यह ध्यान रखना होगा कि आप 'INNumerable ' की 'गणना()' विधि को कॉल कर रहे हैं, न कि 'सूची ' की 'गणना' संपत्ति नहीं, इसलिए यह 'IENumerable ' की गणना की ओर ले जाती है। । – VMAtm

+1

यह सच नहीं है,। गणना() विधि यह समझने के लिए पर्याप्त स्मार्ट है कि क्या अंडरली टाइप एक गिनती संपत्ति का समर्थन करता है, और यदि यह उपलब्ध हो तो उस संपत्ति का उपयोग करेगा। यहां टिप्पणियां देखें: http://msdn.microsoft.com/en-us/library/bb535181.aspx – CodingGorilla

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