रिटर्निंग वैल्यू जिसे एक विधि में पारित किया गया था


390

मेरे पास इंटरफ़ेस पर एक विधि है:

string DoSomething(string whatever);

मैं इसे moq के साथ मॉक करना चाहता हूं, ताकि यह जो कुछ भी पारित किया गया था - कुछ इस तरह से लौटे:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

कोई विचार?

जवाबों:


525

आप एक इनपुट पैरामीटर के साथ एक लैम्ब्डा का उपयोग कर सकते हैं, जैसे:

.Returns((string myval) => { return myval; });

या थोड़ा अधिक पठनीय:

.Returns<string>(x => x);

1
काफी आसान जब तक आप के साथ एक विधि के लिए कर की जरूरत है लगता है 7 तर्क ... जब मैं निरीक्षण किया IReturnsMoq में, यह परिभाषित करता है Returnsके लिए ज्यादा से ज्यादा 4 तर्क । उस के आसपास पाने का कोई आसान तरीका? Moq के स्रोत को संशोधित करने के अलावा मेरा मतलब है /
mizuki nakeshu

14
ठीक है, यह v में 9 तर्कों के लिए परिभाषित है । हल :)Moq4.0.0.0
मिज़ुकी नक्शू

14
@mizukinakeshu मैं 9 तर्क पद्धति पर एक रिफ्लेक्टर पर विचार करूंगा क्योंकि यह लगता है कि कक्षा / विधि बहुत अधिक कर रही है। शायद बाद में आपकी मदद करने के लिए एक सेटिंग वर्ग या संरचना में 9 मापदंडों को प्रतिबिंबित करें?
सीनेटर

@ TheSenator सहमत, मैं पहले से ही यह नहीं बताता कि यह क्या था, लेकिन मुझे लगता है कि मैं सिर्फ कुछ यूनिट परीक्षणों को एक साथ हैक कर रहा था पहले से मौजूद कोड के लिए मैं संशोधित नहीं था, अन्यथा इस संख्या में तर्क निश्चित रूप से रिफैक्टिंग के लिए कॉल करते हैं।
मिज़ुकी नकेशु

27
बस एक नोट के रूप में यह मुझे उलझन में है: स्ट्रिंग .Returns<string>इनपुट पैरामीटर (नों) को संदर्भित करता है और उन मूल्यों को नहीं जो आप वापस कर रहे हैं।
जिम

241

इससे भी अधिक उपयोगी, यदि आपके पास कई पैरामीटर हैं, तो आप इनमें से किसी भी / सभी को एक्सेस कर सकते हैं:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

आपको हमेशा सभी तर्कों को संदर्भित करना होगा, विधि के हस्ताक्षर से मेल खाने के लिए, भले ही आप उनमें से किसी एक का उपयोग करने जा रहे हों।


17
यह स्वीकृत उत्तर होना चाहिए। यह वही है जो आपको करने की आवश्यकता है। कुछ भी "अपेक्षित तर्कों की संख्या" अपवाद को फेंकता है।
चैम एलियाह

हाँ, निश्चित रूप से पढ़ने के लिए आसान आवंटित और ReturnsAsyncभी साथ काम करता है!
पायोत्र कुला

1
इस जवाब से दिन बच गया। नोट (भविष्य के पाठक), आप इसे थोड़ा और आगे भी ले जा सकते हैं। .Rurnurns ((string a, string b, string c) => {string d = "wow"; return string.Concat (a, b, c, d);});
ग्रेनडाकोडर

1
व्यक्तिगत रूप से, यह एक बेहतर जवाब है। मुझे Moq की बहुत कम जानकारी है लेकिन फिर भी मैं इसे तुरंत समझ गया।
unrealsoul007

मेरे द्वारा उपयोग किए गए शून्य को वापस करने के तरीकों के लिए। कॉलबैक ((स्ट्रिंग a, अपवाद b, स्ट्रिंग c) => नई अपवाद (b.Message) फेंकें);
tymtam

62

सामान्य Returns<T>विधि इस स्थिति को अच्छी तरह से संभाल सकती है।

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

या यदि विधि को कई इनपुट की आवश्यकता होती है, तो उन्हें इस तरह निर्दिष्ट करें:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.