2012-02-07 8 views
9

मैं आगामी कॉल सत्यापन करने के लिए कोशिश कर रहा था और मैंने पाया कि moq तरह, इस के लिए InSequence() विधि का समर्थन करता है:क्या मैं mqBehavior के साथ moq की InSequence() का उपयोग कर सकता हूं।

MockSequence s = new MockSequence(); 
validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 
encryptor.InSequence(s).Setup(m=>m.Encrypt(It.IsAny<Frame>())); 
socket.InSequence(s).Setup(m => m.Send(It.IsAny<Frame>())); 
compressor.InSequence(s).Setup(m => m.Compress(It.IsAny<Frame>())); 

हालांकि, यह केवल काम करने जब मैं के रूप में "सख्त" नकली व्यवहार निर्दिष्ट लगता है , जो मुझे मजाकिया वस्तुओं पर अतिरिक्त mehods बुलाता है। हालांकि, मैं उन वस्तुओं पर अन्य विधियों को कॉल करने में सक्षम होना चाहता हूं, मैं बस अनुक्रम में इन कॉलों को निष्पादित करना चाहता हूं।

क्या इसके लिए कोई "समर्थित" तरीका है (कैलबैक() और हस्तनिर्मित कार्यान्वयन का उपयोग करने के बजाय)? मुझे moq.sequence नामक एक अतिरिक्त लाइब्रेरी मिली, हालांकि, precompiled संस्करण नवीनतम Moq के साथ काम नहीं करता है।

उत्तर

9

ठीक है, मैंने एसवीएन ब्राउज़र में मोक के स्रोत कोड में खुदाई करके खुद को मामले की जांच की (केवल रिकॉर्ड के लिए - प्रश्न में moq संस्करण Moq.4.0.10827.Final)।

मेरे जांच मुझे करने के लिए नेतृत्व: http://code.google.com/p/moq/source/browse/trunk/Source/MockSequence.cs?spec=svn751&r=712

विधि InSequence() को देख कर, मैं अब है कि पूरे कार्यान्वयन When() पद्धति पर आधारित है देख सकते हैं।

तो, वास्तव में, निम्नलिखित कोड:

validator.InSequence(s).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

की तरह कुछ के रूप में समाप्त होता है:

validator.When(/* call is made in sequence */).Setup(m => m.IsValid(It.IsAny<Frame>())).Returns(true); 

दूसरे शब्दों में, यह सिर्फ एक सशर्त व्यवहार स्थापित कर रही है - जब विधि है अनुक्रम में बुलाया गया, निर्दिष्ट सेटअप() खेल में आता है। अन्यथा, डिफ़ॉल्ट कार्यान्वयन निष्पादित किया जाता है। और क्योंकि सख्त नकली के लिए, डिफ़ॉल्ट कार्यान्वयन अपवाद फेंकना है (कॉल को अनिर्दिष्ट माना जाता है), पूरा समाधान काम करता है।

इसलिए, ऐसा लगता है कि ढीले मैक्स के साथ काम करने का मौजूदा समाधान काफी बोझिल होगा। मैं सिर्फ कॉलबैक() (जिसे वास्तव में अच्छी तरह से लपेटा जा सकता है) के आधार पर घर के बने समाधानों के साथ चिपके रहूंगा - यह अन्य माध्यमों के लिए कॉलबैक का उपयोग करने की क्षमता को दूर करता है, हालांकि, मैं इसे किसी भी तरह से उपयोग नहीं कर रहा था।

मैं इस उत्तर को आशा में पोस्ट कर रहा हूं कि यह उपयोगी है।

+0

क्या आपने यह सब ** Moq के मुद्दों ** साइट पर पोस्ट किया है? आपको विषय का शोध करना पड़ा, इसलिए मुझे लगता है कि इसे दस्तावेज़ीकरण में समझाया नहीं गया था, इसलिए, वे इस समस्या से अवगत नहीं हो सकते हैं। मैं आपको आश्वस्त कर सकता हूं कि वे वहां पोस्ट किए गए मुद्दों/सुझावों को देखते हैं। इसमें कुछ समय लगता है, लेकिन वे करते हैं। मैंने स्वयं कुछ उपयोगी पैच भेजे हैं (मजाक करने वाले प्रतिनिधियों, गिनती, आदि)। यदि आप शामिल नहीं होना चाहते हैं, तो मैं इस मुद्दे को दोबारा जांच सकता हूं और वहां पंजीकरण कर सकता हूं, लेकिन मुझे लगता है कि जैसा कि आप पहले से ही विवरण जानते हैं, आप इसका बेहतर वर्णन करेंगे :) [बीटीडब्ल्यू। sorki, nie chciałem polskim mieszać na SO :)] – quetzalcoatl

+0

हाय, quetzalcoatl। मुझे नहीं पता था कि मोक वास्तव में बनाए रखा गया था, मोक के लिए कम से कम दो या तीन स्रोत कोड भंडार हैं। क्या यह वर्तमान है: https://github.com/Moq/moq4? क्रिसमस से पहले और नए साल से पहले छुट्टियों के कुछ दिन मेरे पास होंगे, इसलिए शायद मैं कुछ एक साथ रखने की कोशिश करूंगा या कम से कम जांच करूँगा। –

+0

हां, वास्तव में, वर्तमान वाला यह है कि गिटहब पर। पहले Moq को कोड.google पर होस्ट किया गया था, लेकिन वे हाल ही में गिटहब चले गए। गिटहब पर देखी गई समस्या सूची सबसे हालिया हैं, और नए मुद्दों की सूचना दी जानी चाहिए। रिपोर्ट किए गए "पुराने" मुद्दों और फीचर अनुरोधों की संख्या के कारण, कोड.google पर साइट अभी भी मौजूद है और हटाई गई/हटाई गई/आदि नहीं थी।उन्हें गिटहब, आईआईआरसी में स्थानांतरित नहीं किया गया था, क्योंकि उन्हें आयात करने का कोई तरीका नहीं था, और कोई भी वास्तव में उन्हें हाथ से कॉपी नहीं करना चाहता था! उन्हें अभी भी माना जाता है, लेकिन मुझे लगता है कि गिटहब के मुद्दों में पुरानी कोडेक्स पर प्राकृतिक 'प्राथमिकता' है। – quetzalcoatl