2010-03-22 15 views
51

फोन मुझे लगता है कि मैं थोड़ा Moq कॉलबैक तरीकों में से वाक्य रचना पर उलझन में हो सकता है।सेटिंग चर मान()

IFilter filter = new Filter(); 
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() }; 

IQueryable myFilteredFoos = null; 
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Callback((IFilter filter) => myFilteredFoos = filter.FilterCollection(objects)) 
    .Returns(myFilteredFoos.Cast<IFooBar>()); 

यह एक अपवाद फेंकता है क्योंकि myFilteredFoosCast<IFooBar>() कॉल के दौरान रिक्त है: जब मैं इस तरह कुछ करने के लिए प्रयास करें। क्या यह काम नहीं कर रहा है जैसा कि मैं उम्मीद करता हूं? मुझे लगता है कि FilterCollection कहा जाएगा और फिर myFilteredFoos गैर-शून्य होगा और कलाकारों के लिए अनुमति देगा।

FilterCollection एक अशक्त जो मुझे इस निष्कर्ष यह नहीं कहा जा रहा है करने के लिए ड्रॉ लौटने में सक्षम नहीं है। इसके अलावा, जब मैं इस तरह myFilteredFoos घोषित:

Queryable myFilteredFoos; 

वापसी कॉल शिकायत है कि myFilteredFoos से पहले ही आरंभ नहीं हो जाता इस्तेमाल किया जा सकता है।

उत्तर

75

इसका कारण यह है Returns विधि में कोड तुरंत मूल्यांकन किया जाता है है; वह है, जब Setup विधि लागू की जा रही है।

हालांकि, कॉलबैक तक GetByFilter विधि शुरू हो जाती है लागू किया जा रहा है।

सौभाग्य से, Returns विधि ताकि आप के रूप में अच्छी इसके निष्पादन स्थगित कर सकते हैं ओवरलोड हो गया है:

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Callback((IFilter filter) => 
     myFilteredFoos = filter.FilterCollection(objects)) 
    .Returns(() => myFilteredFoos.Cast<IFooBar>()); 

हालांकि, अगर आप क्योंकि आप बस पैरामीटर प्राप्त कर सकते हैं, एक कॉलबैक में मूल्य को बचाने के लिए की जरूरत नहीं है सीधे Returns विधि में मूल्य:

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Returns((IFilter filter) => 
     filter.FilterCollection(objects).Cast<IFooBar>()); 
+0

उत्तर और कोड में कमी के लिए धन्यवाद! –

13

तुम बस वापसी मान में पैरामीटर ले जा सकते हैं ...

mockObject 
    .Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Returns((IFilter filter) => 
    { 
     myFilteredFoos = filter.FilterCollection(objects); 

     return myFilteredFoos.Cast<IFooBar>(); 
    }); 
संबंधित मुद्दे