2012-01-17 4 views
6

मोक के साथ, यह सत्यापित करना संभव है कि का उपयोग करके कुछ तर्कों (यानी, कुछ भविष्यवाणियों को संतुष्ट करने वाले तर्क) के साथ कभी भी कहा जाता है।एक टाइम्स क्यों नहीं है। हमेशा मक़ में?

लेकिन इसे कैसे सत्यापित किया जाए, कोई तरीका नहीं है कि विधि को कितनी बार बुलाया जाता है, यह हमेशा कुछ तर्कों के साथ बुलाया जाता है?

डिफ़ॉल्ट Times.AtLeastOnce प्रतीत होता है।

कोई Times.Always नहीं है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है? धन्यवाद!

संपादित करें: मैंने पिछले सप्ताह Moq मेलिंग सूची में एक सुझाव पोस्ट किया था, लेकिन ऐसा लगता है कि यह अभी तक नियंत्रित नहीं हुआ है। मैं यहां कोई अपडेट पोस्ट करूंगा।

संपादित करें: एक उदाहरण। मान लें कि मैं एक कक्षा का परीक्षण कर रहा हूं जो एक्सएमएल दस्तावेज़ उत्पन्न करता है। मैं यह सुनिश्चित करना चाहता हूं कि केवल वैध दस्तावेज उत्पन्न हो जाएं। दूसरे शब्दों में, परीक्षण करें कि लेखक निर्भरता केवल मान्य अनुक्रम संख्या के साथ वैध दस्तावेज़ों के साथ, लिखने के लिए है।

should_only_write_valid_xml_documents 

Mock.Get(this.writer).Verify(
    w => w.Write(
     It.Is<XDocument>(doc => XsdValidator.IsValid(doc)), 
     It.Is<int>(n => n < 3)), 
    Times.Always); 
+2

"हमेशा" यह जानकर कितनी बार का मतलब "हमेशा "है, और यदि आप जानते हैं कि इसके बजाय टाइम्स (एन) का उपयोग क्यों नहीं करते? – mtijn

+0

नहीं, ऐसा नहीं है - यह सवाल का मुद्दा है। कल्पना करें कि एक लूप में एक विधि कहा जा रहा है जिसका आकार गतिशील रूप से निर्धारित किया गया है। –

+0

फिर लूप पुनरावृत्ति के अंदर मैं जांच करता हूं कि विधि बार-बार, बार-बार कहा जाता था। यह मान रहा है कि लूप परीक्षण कोड में है। यदि यह कोड के बजाय परीक्षण किया जा रहा है, तो मैं टेस्टेबिलिटी के लिए फिर से डिजाइन करूँगा ताकि मैं प्रत्येक विधि कॉल को जांचने के लिए लूप कोड में हुक कर सकूं। – mtijn

उत्तर

3

ऐसा लगता है जैसे आप "सख्त" नकली व्यवहार चाहते हैं। यदि विधि अपेक्षित मानकों के अलावा किसी अन्य चीज़ के साथ बुलाया जाता है, तो परीक्षण विफल हो जाएगा।

यह Moq में उपलब्ध है:

var mock = new Mock<IFoo>(MockBehavior.Strict); 

(। उदाहरण Moq QuickStart से लिया गया)

नकली पर हर मंगलाचरण अब एक इसी Setup होना आवश्यक है।

सख्त मैक्स का उपयोग करके भंगुर परीक्षणों का कारण बनता है। मैं इस तकनीक से बचूंगा, या कम से कम इसे कम इस्तेमाल करूँगा।

+1

निश्चित - लेकिन यदि यह अस्तित्व में था, तो यह विकल्प मुझे सख्त नकली स्विच करने और अतिरिक्त सेटअप में शामिल होने के दर्द से बचने की अनुमति देता है। –

8

और कितनी बार 'हमेशा?' मोक कुछ बार एक निश्चित विधि के साथ कुछ तर्कों के साथ कॉल किया जाता है, और उसके बाद टाइम्स की तुलना करने के लिए उस नंबर का उपयोग करता है। कभी भी टाइम्स। एटलास्टऑन्स, आदि

तो, यदि कोई विधि 4 बार निष्पादित की जाती है और आप सेट करते हैं यह 'टाइम्स। हमेशा' के लिए इसका क्या अर्थ है?

टाइम्स। कोई भी यह सुनिश्चित करने के लिए जांच करेगा कि संख्या शून्य है।

टाइम्स। एटलास्टऑन एक बार जांच करेगा कि संख्या एक से अधिक या बराबर है।

टाइम्स। हमेशा यह जांच लेंगे कि संख्या है ....?

आप समय की संख्या निर्धारित कर सकते हैं यह प्रोग्राम के रूप में चलाना चाहिए, तो कुछ ऐसे कार्य करें:

Times.Exactly(calculatedAmount) 

लेकिन वहाँ के लिए Moq को पता है कि 'हमेशा' का अर्थ है कोई रास्ता नहीं है।

+0

मैं नहीं देख सकता कि यह कैसे संभव हो सकता है। Moq जानता है कि "कभी नहीं" का मतलब है - "हमेशा" "कभी नहीं" के विपरीत है। आपके द्वारा उल्लिखित संख्या की तुलना शून्य की तुलना में, इनवॉक्शंस की कुल संख्या से की जाएगी। –

+1

@PeteMontgomery Moq जानता है कि "कभी नहीं" का अर्थ है क्योंकि इसका मतलब शून्य है। "हमेशा" एक संदिग्ध संख्या है जिसमें कोई सकारात्मक पूर्णांक शामिल हो सकता है। मोक को यह जांचने के लिए चाहते हैं कि प्रत्येक बार एक विधि कहलाए जाने पर इसे कहा जाता है, यह एक महत्वपूर्ण बिंदु प्रतीत होता है। यदि आप कई बार निष्पादन कर रहे हैं (जैसे लूप में), तो बस एक वैरिएबल रखें जो दर्शाता है कि कितनी बार इसे कॉल किया जाना चाहिए था और टाइम्स पर परीक्षण करने वाले परीक्षण को चलाया जाना चाहिए। वास्तव में (numTimesShouldRun)। – docmanhattan

+0

हम्म, मुझे डर है कि मुझे लगता है कि यह स्वयं विरोधाभासी है, या सवाल के बिंदु को गलत समझा जाता है। मैं परीक्षण के बारे में बात कर रहा हूं कि हर बार एक विधि कहलाती है, इसे * कुछ तर्कों के साथ * कहा जाता है। अन्य उत्तरों देखें। –

0

मेरी सिफारिश इसके साथ विधि के लिए 'फ़ॉलबैक' मिलान बनाना होगा। किसी भी स्थिति में। फिर आप टाइम्स को सत्यापित कर सकते हैं। उस मिलान पर कभी भी, जिसे हमेशा अधिक विशिष्ट मिलान से हटा दिया जाना चाहिए।

+0

क्या आप दिखा सकते हैं कि यह कैसे करें? (सत्यापित करने के लिए कॉल "इसके माध्यम से गिरने" नहीं करते हैं, यदि आपका यही मतलब है - वे स्वतंत्र हैं जहां तक ​​मैं देख सकता हूं।) या क्या आप का मतलब है कि टाइम्स का उपयोग करने के लिए परीक्षण को फिर से लिखें। कभी नहीं? कभी-कभी यह संभव नहीं है, क्योंकि आपको सभी संभावित अमान्य तर्क निर्दिष्ट करना होगा। चीयर्स, पीट। –

2

आप हमेशा सत्यापित करने के लिए तर्क के उलटा लागू कर सकते हैं।

उदाहरण के लिए:

मान लीजिए कि आप निम्नलिखित सत्यापन करने के लिए चाहते हैं:

mock.Verify(x => x.Method(It.Is<int>(i => i == 10)), Times.Always()); 

आप बस से बदलने कर सकते हैं:

mock.Verify(x => x.Method(It.Is<int>(i => i != 10)), Times.Never()); 
+0

हाय, मेरे प्रश्न के लिए सटीक प्रेरणा यह है कि यद्यपि आप इसे सरल मामलों में कर सकते हैं, उदाहरण के लिए, आप इसे सभी मामलों में नहीं कर सकते हैं। उदाहरण के लिए: एक विधि को सत्यापित करें जिसे कभी भी एक XML दस्तावेज़ के साथ बुलाया जाता है जो कुछ मानदंडों को पूरा करता है।आप उन सभी संभावित XML दस्तावेज़ों को नहीं लिख सकते हैं जो उन मानदंडों को पूरा नहीं करते हैं, इसलिए आप टाइम्स का उपयोग करने के लिए सत्यापन को "उलटा" नहीं कर सकते हैं। –

+0

क्षमा करें, मैं इस आखिरी बिंदु पर पूरी तरह से गलत हूं - मुझे अभी एहसास हुआ है कि आप आम तौर पर टाइम्स का उपयोग और उपयोग कर सकते हैं। बशर्ते - बशर्ते आप एक समय में केवल एक तर्क का परीक्षण कर रहे हों। –

संबंधित मुद्दे