2011-03-07 8 views
5

हमारे एपीआई एक अंतरफलक IEnumerable से इस तरह विरासत में है छोटा करते के साथ:राइनो का मजाक उड़ाता है: समस्या IEnumerator.MoveNext() जब एक IEnumerable <T> इंटरफ़ेस

public interface IFoos : IEnumerable<IFoo> 
{ 
    // Additional foo-collection-specific methods 
} 

मैं एक वर्ग के लिए एक इकाई परीक्षण लिख रहा हूँ कि पर निर्भर करता है IFoos।

[Test] 
public void FooItUp_JumpsUpJumpsUpAndGetsDown() 
{ 
    // Arrange 
    var mocks = new MockRepository(); 
    var stubFoo1 = mocks.Stub<IFoo>(); 
    var stubFoo2 = mocks.Stub<IFoo>(); 
    var stubFoos = mockRepository.Stub<IFoos>(). 
    var fooEnumerator = new List<IFoo> { stubFoo1, stubFoo2 }.GetEnumerator(); 
    stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = fooEnumerator); 
    Bar bar = new bar(); 
    bar.Foos = stubFoos; 

    // Act 
    bar.FooItUp(); 

    // Assert 
    ... 

} 

जब:

public class Bar 
{ 

    public IFoos Foos {get; set;} 
    public void FooItUp() 
    { 
     foreach (IFoo foo in this.Foos) 
     { 
      foo.JumpAround(); 
     } 
    } 
} 

मेरी इकाई परीक्षण में, मैं निर्भरता बाहर ठूंठ और इतने तरह राइनो Mocks के साथ एक गणनाकार वापस जाने के लिए प्रबंधन: यह एक विधि है कि एक IFoos पर दोहराता है, इस तरह है मैं इस परीक्षण चलाने की कोशिश, एक अपवाद फेंका जाता है:

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

IEnumerable इंटरफ़ेस को देखते हुए, हालांकि, केवल विधि मैं लागू करने या एक वापसी मान सेट करने के GetEnumerator() जो मैं एक किया है के लिए होना चाहिए बोव, है ना? Bar.FooItUp() में फोरैच लूप क्यों नहीं है सूची गणनाकर्ता पर MoveNext() को कॉल करें?

+2

आपके परीक्षण/मैक्स/उदाहरण कोड के नाम के लिए प्रमुख प्रोप। :-) –

उत्तर

6

Durrr।

मैं उन पर अभिनय करने से पहले अपने स्टब्स को रीप्ले स्टेट में नहीं डाल रहा था।

लाइन जोड़ना: bar.FooItUp कॉल करने से पहले

mocks.ReplayAll(); 

() समस्या का समाधान हो।

2

बदलने का प्रयास करें:

stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = fooEnumerator); 

करने के लिए:

stubFoos.Stub(x => x.GetEnumerator()).Return(fooEnumerator); 

संपादित: यह सवाल आप लिंक में दिलचस्प जानकारी।

इसे देखा है, की कोशिश:

stubFoos.Stub(x => x.GetEnumerator()).Return(null).WhenCalled(x => x.ReturnValue = new List<IFoo> { stubFoo1, stubFoo2 }.GetEnumerator()); 
+0

हां, नहीं जाना ... यह मेरा प्रारंभिक रूप से जैसा दिखता है, इस सवाल के अनुसार: http://stackoverflow.com/questions/391411/mocking-getenumerator-method-of-an-ienumerablet-types –

+0

कोशिश की दुर्भाग्य से, इससे कोई फर्क नहीं पड़ता कि मैं गणक इनलाइन को परिभाषित करता हूं या नहीं। –

+0

मान लीजिए कि आप IFoos के ठोस उदाहरण के अंदर एक संग्रह प्रकार एकत्र कर रहे हैं, क्या IFoos का ठोस उदाहरण संग्रहण प्रकार के निर्भरता इंजेक्शन की अनुमति देता है? मैं मजाक करने की बजाए ऐसा करूंगा। –

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