2009-07-29 12 views
24

मेरी टीम ने हाल ही में मोक का उपयोग अपने जबरदस्त लचीलापन और अत्यधिक पठनीय वाक्यविन्यास के लिए हमारे मॉकिंग फ्रेमवर्क के रूप में करने का निर्णय लिया है। जैसा कि हम इसके लिए नए हैं, मैं सरल प्रश्नों के बारे में सोच रहा हूं - खोज (यहां, Google, इत्यादि) मोक के अन्य नतीजों पर बहुत सी चर्चाएं पाती हैं, लेकिन जरूरी नहीं कि मैं क्या कर रहा हूं, और कुछ प्रतीत होता है संबंधित प्रश्न लाल हेरिंग में बदल गए हैं।मोक के साथ "लघु सर्किटिंग" शून्य विधियां?

हम एक ऐसे वर्ग का परीक्षण कर रहे हैं जिसमें बाहरी निर्भरता है (अमेज़ॅन सरल डीबी सटीक होना चाहिए) लेकिन नहीं चाहते कि हमारे परीक्षण लाइव कनेक्शन से जुड़े हों। एक विशेष विधि:

  • , कुछ "व्यापार" तर्क
  • तो उचित लागू होता है एक प्रदाता हम का निर्माण किया है के माध्यम से SDB के लिए बाहर एक कॉल का आह्वान, चलो इसे कहते SaveItem()

मैं इकाई करना चाहते हैं इस तरह परीक्षण करें कि हम आवश्यक संदर्भ स्थापित करते हैं और बीमा करते हैं कि SaveItem() का आह्वान किया गया था, लेकिन इस तरह से SaveItem() वास्तव में नहीं बुलाया जाता है (क्योंकि ए) एसडीबी के लिए प्रदाता एक नकली है जो पूरी तरह से हाइड्रेटेड नहीं है और संभवतः बम और बी) मैं उस लेनदेन के लिए सैकड़ों और हजारों बार भुगतान नहीं करना चाहता)।

एक मूल्य लौटाए गए तरीकों से निपटने पर, यह मामूली था।

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo"); 

मामले कि मैं ही उपरोक्त रूपरेखा में, मेरा "SaveItem()" विधि शून्य है और इसलिए विकल्प Moq के Returns() विधि का उपयोग करने के लिए है उपलब्ध नहीं है। और जब मैं SaveItem() को सत्यापित करने के लिए कॉलबैक सेट कर सकता हूं, तो मुझे लगता है कि वास्तव में कुछ भी नहीं करने के लिए मुझे लगता है।

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

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())); 

तो मिलियन डॉलर सवाल: निम्न काल्पनिक कोड की MOQ क्या है?

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE(); 
+0

संपादित स्थिति स्पष्ट करने, परीक्षण एक "व्यापार" वर्ग के आसपास चल, वास्तविक SimpleDB कार्यान्वयन के लिए नहीं करने के लिए है। सरल डीबी कार्यान्वयन का परीक्षण कहीं और किया जाता है, यह वही है जो मैं मजाक कर रहा हूं। – bakasan

उत्तर

29

तो SaveItem() विधि आभासी या सार है, और आप Callbase = true की स्थापना नहीं कर रहे हैं, तो विधि नकली द्वारा कुछ भी नहीं करना फिर से लागू किया जाना चाहिए।

आप ऐसा करने में सक्षम होना चाहिए:

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); 

... test here ... 

mockDb.Verify(); 
+0

बिल्कुल सही! बिल्कुल कोई विचार नहीं था कि सत्यापन योग्य()/सत्यापन() सामान, और अधिक औपचारिक दस्तावेज का इरादा था, उस क्षेत्र में धागे और पदों को पढ़ने के लिए भी जाना जाता था। बस इसे एक भंवर दिया और अब मुझे इस परिदृश्य के खिलाफ सकारात्मक और नकारात्मक दोनों परीक्षण मामले मिल गए हैं। बहुत धन्यवाद! – bakasan

+2

+1; इसके अलावा, आप mockDb.VerifyAll() –

+0

पर कॉल करके सत्यापन योग्य() ध्वज के बावजूद अपनी सभी कॉल को भी सत्यापित कर सकते हैं। इस परिदृश्य के लिए अन्य परिदृश्य के लिए विस्तारित होने के लिए संभव है i.e विधि न तो आभासी और न ही सार है? – leon

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