पर आधारित फ़ंक्शन रिटर्न सेट अप करने के लिए मुझे एमएसएमक्यू को कॉल करने के लिए एक इंटरफ़ेस का नकल करने की आवश्यकता है, क्या मैं एक एमएसएमक्यू परिदृश्य को अनुकरण करने के लिए एमओक का उपयोग कर सकता हूं कि कतार में 10 संदेश हैं, मैं मजाक करता हूं 10 बार कार्य करें और मैं एक पूर्व परिभाषित वस्तु प्राप्त कर सकता हूं, 11 वें समय मुझे एक अलग वापसी मूल्य (जैसे शून्य) प्राप्त करना चाहिए?एमओक ने बुलाए गए समय
उत्तर
Moq अब एक विस्तार विधिMoq
नाम स्थान आप प्रत्येक विशिष्ट कॉल के लिए एक विशिष्ट वापसी मान परिभाषित कर सकते हैं जिसका मतलब है कि में SetupSequence()
कहा जाता है।
सामान्य विचार यह है कि आप केवल अपनी आवश्यक मूल्यों को चेन करते हैं। पहली कॉल bellow उदाहरण में जो वापस आ जाएगी और दूसरी कॉल जेन वापस आ जाएगी:
customerService
.SetupSequence(s => s.GetCustomerName(It.IsAny<int>()))
.Returns("Joe") //first call
.Returns("Jane"); //second call
कुछ अधिक जानकारी here।
मैं कभी कभी इस तरह के परिदृश्यों के लिए एक सरल काउंटर का उपयोग करें:
int callCounter = 0;
var mock = new Mock<IWhatever>();
mock
.Setup(mock => mock.SomeMethod())
.Returns(() =>
{
if (callCounter++ < 10)
{
// do something
}
else
{
// do something else
}
});
अच्छा समाधान। 'कैलबैक (...)' को जोड़ना भी संभव है जहां इलिप्सिस प्रतिनिधि का प्रतिनिधित्व करता है जो 'कॉलकॉन्टर' और संभवतः अन्य राज्य को संशोधित करता है। –
यह वास्तव में एक बहुत ही शानदार विचार है। – hardywang
आप इसे करने के लिए एक अलग कार्य भी सेट कर सकते हैं। यदि आप चाहें तो आप फ़ंक्शन को पैरामीटर भी पास कर सकते हैं:
_serviceMock.Setup(x => x.SomeMethod(It.IsAny<String>())).Returns((String param) => getTimesCalled(param));
यह वही था जो मैं देख रहा था :) कमाल। – Silwing
यह भी बेहतर है! – hardywang
ऐसा लगता है कि लिंक अप्रासंगिक है:/ – reddy