2010-02-19 11 views
5

मेरे पास एक क्लास एपीआई है जिसमें पूर्ण कोड कवरेज है और मुख्य क्लास फ़ंक्शन (जॉब.रुन) में सभी तर्कों को मॉक करने के लिए DI का उपयोग करता है जो सभी काम करता है।NMock2.0 - एक गैर इंटरफ़ेस कॉल कैसे रोकें?

मुझे उत्पादन में एक बग मिला जहां हम डेटा इनपुट फ़ील्ड में से कुछ पर कुछ सत्यापन कर रहे थे।

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

बढ़िया, अब हम सत्यापन कार्यों को जानते हैं। समस्या यह है कि मैं यह सुनिश्चित करने के लिए परीक्षण कैसे लिखूं कि ValidateFoo() वास्तव में Job.Run() के अंदर बुलाया जाता है? ValidateFoo() जॉब क्लास का एक निजी तरीका है - इसलिए यह एक इंटरफ़ेस नहीं है ...

क्या NMock2.0 के साथ ऐसा करने के लिए वैसे भी है? मुझे पता है टाइपमैक गैर इंटरफ़ेस प्रकारों के झुंड का समर्थन करता है। लेकिन अभी नकली libs बदलना एक विकल्प नहीं है। इस बिंदु पर यदि NMock इसका समर्थन नहीं कर सकता है, तो मैं बस ValidateFoo() कॉल को रन() विधि में जोड़ दूंगा और मैन्युअल रूप से परीक्षण करूँगा - जो स्पष्ट रूप से मैं अपने जॉब पर विचार नहीं करना चाहूंगा। Run() विधि है अभी 100% कवरेज। कोई सलाह? बहुत बहुत धन्यवाद इसकी सराहना की है।

संपादित करें: मेरे पास अन्य विकल्प है जो सिर्फ मेरे काम के लिए एकीकरण परीक्षण बनाना है। रून कार्यक्षमता (इसे मोक्स के बजाय समग्र वस्तुओं के वास्तविक कार्यान्वयन में इंजेक्शन देना)। मैं इसे उस क्षेत्र के लिए एक खराब इनपुट मान दूंगा और फिर यह सत्यापित करूंगा कि नौकरी विफल रही है। यह काम करता है और अपने परीक्षण को शामिल किया गया - लेकिन यह वास्तव में एक इकाई परीक्षण लेकिन इसके बजाय एक एकीकरण परीक्षण है कि कार्यक्षमता की एक इकाई का परीक्षण करती है .... हम्म नहीं है ..

EDIT2: वहाँ tihs करने के लिए कोई रास्ता नहीं है? किसी के पास विचार हैं? शायद TypeMock - या एक बेहतर डिजाइन?

उत्तर

5

The current version of NMock2 ठोस प्रकार के नकली कर सकते हैं (मैं बिल्कुल याद नहीं है कि कौन सा संस्करण वे इस जोड़े गये है, लेकिन हम संस्करण 2.1 का उपयोग कर रहे) ने अधिकांश परिचित सिंटैक्स का उपयोग:

Job job = mockery.NewMock<Job>(MockStyle.Transparent); 
Stub.On(job).Method("ValidateFoo").Will(Return.Value(true)); 

MockStyle.Transparent निर्दिष्ट करता है कि आप कुछ भी अंतर्निहित कार्यान्वयन से स्टब या उम्मीद नहीं की जानी चाहिए - ताकि आप जिस उदाहरण का परीक्षण कर रहे हैं उस पर विधियों के लिए उम्मीदों को रोक और सेट कर सकें।

हालांकि, आप केवल सार्वजनिक तरीकों (और गुणों) पर अपेक्षाओं को रोक सकते हैं और सेट कर सकते हैं, जो वर्चुअल या सार भी होना चाहिए। तो एकीकरण परीक्षण पर भरोसा करने से बचने के लिए, आपके पास दो विकल्प हैं:

  • Job.ValidateFoo() सार्वजनिक और आभासी बनाएं।
  • प्रमाणीकरण तर्क को एक नई कक्षा में निकालें और Job में एक उदाहरण इंजेक्ट करें।
1

चूंकि सभी निजी सार्वजनिक विधियों द्वारा बुलाए जाते हैं (जब तक कि प्रतिबिंब रनटाइम निष्पादन पर भरोसा न हो), तो उन निजी लोगों को सार्वजनिक तरीकों से निष्पादित किया जा रहा है। उन निजी तरीकों से वस्तु को निष्पादित करने से परे ऑब्जेक्ट में परिवर्तन हो रहे हैं, जैसे वर्ग फ़ील्ड सेट करना या अन्य ऑब्जेक्ट्स में कॉल करना। मुझे निजी विधि को कॉल करने के उन "परिणामों" को पाने का एक तरीका मिलेगा। (या उन चीज़ों का मज़ाक उड़ाते हैं जिन्हें निजी तरीकों से निष्पादित नहीं किया जाना चाहिए।)

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

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