2013-01-16 44 views
18

पर आधारित फ़ंक्शन रिटर्न सेट अप करने के लिए मुझे एमएसएमक्यू को कॉल करने के लिए एक इंटरफ़ेस का नकल करने की आवश्यकता है, क्या मैं एक एमएसएमक्यू परिदृश्य को अनुकरण करने के लिए एमओक का उपयोग कर सकता हूं कि कतार में 10 संदेश हैं, मैं मजाक करता हूं 10 बार कार्य करें और मैं एक पूर्व परिभाषित वस्तु प्राप्त कर सकता हूं, 11 वें समय मुझे एक अलग वापसी मूल्य (जैसे शून्य) प्राप्त करना चाहिए?एमओक ने बुलाए गए समय

उत्तर

22

Moq अब एक विस्तार विधिMoq नाम स्थान आप प्रत्येक विशिष्ट कॉल के लिए एक विशिष्ट वापसी मान परिभाषित कर सकते हैं जिसका मतलब है कि में SetupSequence() कहा जाता है।

सामान्य विचार यह है कि आप केवल अपनी आवश्यक मूल्यों को चेन करते हैं। पहली कॉल bellow उदाहरण में जो वापस आ जाएगी और दूसरी कॉल जेन वापस आ जाएगी:

customerService 
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>())) 
.Returns("Joe") //first call 
.Returns("Jane"); //second call 

कुछ अधिक जानकारी here

+0

यह वही था जो मैं देख रहा था :) कमाल। – Silwing

+0

यह भी बेहतर है! – hardywang

+0

ऐसा लगता है कि लिंक अप्रासंगिक है:/ – reddy

12

मैं कभी कभी इस तरह के परिदृश्यों के लिए एक सरल काउंटर का उपयोग करें:

int callCounter = 0; 
var mock = new Mock<IWhatever>(); 
mock 
    .Setup(mock => mock.SomeMethod()) 
    .Returns(() => 
    { 
     if (callCounter++ < 10) 
     { 
      // do something 
     } 
     else 
     { 
      // do something else 
     } 
    }); 
+2

अच्छा समाधान। 'कैलबैक (...)' को जोड़ना भी संभव है जहां इलिप्सिस प्रतिनिधि का प्रतिनिधित्व करता है जो 'कॉलकॉन्टर' और संभवतः अन्य राज्य को संशोधित करता है। –

+0

यह वास्तव में एक बहुत ही शानदार विचार है। – hardywang

2

आप इसे करने के लिए एक अलग कार्य भी सेट कर सकते हैं। यदि आप चाहें तो आप फ़ंक्शन को पैरामीटर भी पास कर सकते हैं:

_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));