Moq में Verifiable () का उद्देश्य क्या है?


125

का उद्देश्य क्या है Verifiable()?

अगर मैं सत्यापित करता हूं Mockऔर इसे छोड़ देता हूं तो यह अभी भी सत्यापित होता है SetUp

संपादित करें: मैं VerifyAll()इस प्रकार सब कुछ सत्यापित किए जाने का कारण उपयोग कर रहा था । Verify()केवल मेरे बदलने के बाद .Verifiable() SetUpजाँच की जा रही थी।

जवाबों:


83

ADDENDUM: अन्य उत्तर के रूप में, का उद्देश्य "स्थगित कॉल" के एक सेट में .Verifiableसूचीबद्ध करना है, जिसके माध्यम से ट्रिगर किया जा सकता है ।SetupVerify(...)mock.Verify()

ओपी का स्पष्टीकरण यह स्पष्ट करता है कि यह लक्ष्य था और एकमात्र समस्या यह पता लगा रही थी कि यह काम क्यों नहीं कर रहा है, लेकिन @Liam के रूप में, इसका जवाब वास्तव में इस पर भी होना चाहिए: - कुंजी उपयोग के मामले जहाँ तक मैं कर सकता हूँ देख रहे हैं:

  • एक के बीच सूखापन को बनाए रखने mock.Setup()औरmock.Verify
  • वास्तविक Verifyकॉल से ही सत्यापन के विन्यास को डिस्कनेक्ट करने की अनुमति देना (जैसे, आप इसे किसी अन्य सहायक विधि में सेट कर सकते हैं)

... और मेरे उत्तर पर वापस, जो प्रभावी रूप से कहता है "सावधान रहें क्योंकि उपरोक्त पेशेवरों को आमतौर पर इस आशय से माना जाता है कि उन लक्ष्यों को प्राप्त करने की क्षमता और परीक्षणों की स्थिरता पर है जो ऐसे निर्माणों पर बहुत अधिक झुकते हैं"

मूल: ध्यान दें कि जहां संभव हो, एक का पालन करना चाहिए एएए लेआउट और इसलिए एक जाना चाहिए स्पष्ट कर mock.Verify( expression )कॉल के बाद काम, किया गया है बल्कि एक से mock.Setup( ... ).Verifiable()एक साथ रखा mock.Verify()याmock.VerifyAll() जहां भी संभव (क्रेडिट: @kzu )।


7
@ EricSmith पीछे मुड़कर देखें, मुझे नहीं लगता कि मैंने इसे दृढ़ता से रखा है। अपने कार्य को एएए बंडलिंग में विभाजित करने से बड़े पैमाने पर अधिक लाभ होता है, अरेंज और एसेर चरण के बीच समानता पर ओवरकेंट्रेंटिंग से। 90% समय, वहाँ कुछ है कि आप अंत में सत्यापित कॉल कैसे व्यक्त करते हैं, की बारीकियों से प्राप्त किया जा सकता है, इसलिए आपको इसके लिए अनुकूलन करने के लिए बहुत समय लेना चाहिए, भले ही कुछ मामलों में अगर कुछ दर्दनाक दोहराव जैसा लगता है। Manning.com/osherove में से एक बिंदु बहुत अच्छी तरह से है कि एक परीक्षण किसी को कूदने के लिए समझ में आता है कि महत्वपूर्ण-सम्मेलन के लिए छड़ी है!
बार्टनेल

3
मैं सामान्य रूप से स्वीकार किए गए ज्ञान के अनाज के खिलाफ जाने के लिए नहीं हूं, लेकिन सभी मामलों में एएए बनाम Verifyable()/ के लाभों के बारे में अभी तक असंबद्ध हूं VerifyAll()। मेरे वर्तमान इकाई परीक्षण में बड़ी संख्या में Setup(...)कॉल (> 30) हैं। कन्वेंशन को संतुष्ट करने के लिए एक बराबर वेरिफाई () के साथ हर एक का मिलान किया जा सकता है लेकिन इससे बड़ी मात्रा में कोड दोहराव होता है और यूनिट टेस्ट बढ़ने की संख्या को बनाए रखने और पढ़ने के लिए मुश्किल हो जाएगा। मुझे लगता है कि मैं वास्तव में पूछ रहा हूं कि क्या अपवाद हो सकते हैं यदि बड़ी संख्या में सेटअप हैं या Verifiable()एक कठिन और तेज नियम का परिहार है ?
स्टीव चेम्बर्स

5
@SteveChambers एएए का एक प्रमुख तत्व यह है कि यह ए * नहीं है - एक एकल अधिनियम और एक एकल निबंध होना चाहिए। तो जब आप तकनीकी रूप से यह कहने में सही होते हैं कि यह आपके लिए कम कोड है, तो आपके सेटअप के कौन से संयोग लागू होते हैं, जो (उप) अधिनियमों और (उप) के अनुसार अपरिवर्तनीय रूप से एक खान क्षेत्र बन जाएगा। तो नहीं, यह कठिन और तेज़ नहीं है, लेकिन मैं कहूंगा कि यह सुझाव है कि यह 50:50 के करीब भी है, बहुत बुरा सलाह होगी। (यह भी ध्यान दें कि जब तक आप अधिनियम के दौरान किसी विशेष व्यवहार को लागू करने की कोशिश नहीं कर रहे हैं, तब तक आपको एक सत्यापन करने के लिए सेटअप करने की आवश्यकता नहीं है - जो कि अभी तक स्पष्ट परीक्षणों का एक अन्य तत्व है)
रूबेन बार्टेलिंक

1
@Liam और यह है वास्तव में पूरी तरह से ठीक है कि आप अभी भी आश्वस्त कर रहे हैं यह आपके काम के लिए एक उपयुक्त उपकरण है - तथ्य यह है कि यह बड़े करीने से सूखापन को प्राप्त होता है के बावजूद यानी - मेरा असली बात सिर्फ यह है कि यह mocks के साथ परीक्षण लेखन के लिए एक सामान्य दृष्टिकोण के रूप में पर सिकोड़ी है ए Setupऔर ए के बीच Verify, जो एक उच्च जीत हासिल कर सकता है वह केवल एएए द्वारा सुझाए गए तरीके से
डीआरवाई

1
@ लिम को धन्यवाद के लिए धन्यवाद; मैंने अपना उत्तर अपडेट कर दिया क्योंकि आप जो बिंदु बना रहे हैं, उसमें आप सही हैं। दिन में जब मैंने एसओ के सवालों का जवाब दिया, तो मेरा विचार आम तौर पर एक परमाणु जवाब देने का था और फिर दूसरे जवाबों की तरह प्रतिस्पर्धात्मक जवाब देना चाहिए। इन दिनों (यदि मुझे अभी भी प्रश्नों का उत्तर देने में समय लगा है) तो मैं संभवतः पूर्ण उत्तर देने की कोशिश करूँगा कि यह पहली बार में हो गया है।
बार्टनलिंक

54

जब Verify()परीक्षण के अंत में विधि को बुलाया जाता है, यदि सत्यापन के रूप में चिह्नित किसी भी अपेक्षा को नहीं बुलाया गया है, तो एक अपवाद है thrown

VerifyAll() सत्यापन योग्य अपेक्षाओं के लिए जाँच नहीं करता है।


क्या आप VerifyAll () सत्यापन योग्य अपेक्षाओं की जाँच नहीं करते हैं, के बारे में कुछ और समझाना चाहेंगे?
JW

@JW का अर्थ है कि वेरीएफ़ल सभी सेटअपों की पुष्टि किए बिना यह विचार करता है कि क्या उन्हें सत्यापन योग्य अपेक्षाओं के रूप में चिह्नित किया गया है।
17
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.