2012-04-10 20 views
7

का उपयोग किए बिना एएसपी.नेट एमवीसी नियंत्रक का यूनिट परीक्षण कैसे करें मैं बस सोच रहा हूं कि अगर मैं एक तरीका तरीका कर सकता हूं कि एमवीसी में रिपोजिटरी पैटर्न का उपयोग किए बिना मैं अपने कुछ नियंत्रक एक्शन का परीक्षण कर सकता हूं। मैंने एएसपी.नेट एमवीसी साइट विकसित की है लेकिन शुरुआती चरण में यूनिट परीक्षण के बिना ऐसा किया है। अब मैं अपने नियंत्रक में दो या दो से अधिक क्रियाओं का उपयोग कर अपने शिक्षक के लिए कुछ यूनिट परीक्षण प्रदर्शित करना चाहता हूं। मेरे अधिकांश क्रिया तर्क डेटाबेस से डेटा प्राप्त करते हैं और एक नियंत्रक को अलग-अलग तालिकाओं से डेटा प्राप्त करने वाले एक नियंत्रक में विभिन्न तालिकाओं से डेटा प्राप्त होता है। जो मुझे लगता है कि जेनेरिक रिपोजिटरी पैटर्न का उपयोग करके परीक्षण किया जा सकता है। एक नौसिखिया के रूप में मैंने पाया कि मैं केवल एक कोड का परीक्षण कर सकता हूं जो डेटाबेस से नहीं आ रहा है लेकिन दुर्भाग्यवश मेरे नियंत्रक क्रियाओं में से अधिकांश कोड डेटाबेस से आते हैं। मैं अपने डेटाबेस के लिए विजुअल स्टूडियो और ईएफ कोड के पहले दृष्टिकोण में डिफ़ॉल्ट परीक्षण उपकरण का उपयोग कर रहा हूं।
उदाहरण के लिए, मैं एक ही नियंत्रक में मौजूद अन्य क्रियाओं का परीक्षण करने के बिना केवल नीचे क्रियाओं का परीक्षण करना चाहता हूं।रिपोजिटरी पैटर्न

public ActionResult Index() 
    { 
     var model = _db.PhotoGallery; 
     return View(model); 
    } 

यह केवल प्रदर्शन उद्देश्य के लिए है।

उत्तर

6

परिभाषा के अनुसार, एक इकाई परीक्षण केवल उस विधि को प्रभावित करेगा जो इसे कॉल करता है। यदि आप अपने _ डीबी ऑब्जेक्ट को नकल करने का कोई तरीका ढूंढ सकते हैं ताकि आप वास्तव में डेटाबेस राउंड-ट्रिप नहीं कर रहे हैं, तो आप इस विधि पर परीक्षण कर सकते हैं जो इस पर निर्भर करता है। अन्यथा, नहीं।

क्या आपके _db फ़ील्ड का एक इंटरफ़ेस है? क्या यह इंजेक्शन के माध्यम से प्रदान किया जा रहा है? यदि ऐसा है, तो संभव है कि आप इस विधि का परीक्षण कर सकें।

5

आपके नियंत्रक विधियों में डेटाबेस की प्रत्यक्ष निर्भरता को हटाए बिना आप इन विधियों का परीक्षण करने में सक्षम नहीं होंगे।

ऐसा करने का समग्र अनुशंसित तरीका एक आईओसी कंटेनर (उदा। Ninject) का उपयोग एमवीसी के साथ संयोजन में करेगा जो आपको अपने नियंत्रक के निर्माता को आवश्यक डेटा पास करने की अनुमति देता है। वह "डेटा ऑब्जेक्ट" डेटाबेस से बंधे नहीं होना चाहिए, आमतौर पर यह केवल एक POCO ऑब्जेक्ट है या एक इंटरफेस के रूप में पारित किया गया है।

अपने यूनिट परीक्षणों में आप इन यूनिट परीक्षणों के लिए निर्मित इन-मेमोरी डेटा ऑब्जेक्ट का उपयोग करके इन निर्भरताओं को प्रतिस्थापित कर सकते हैं, आम तौर पर एक मॉकिंग फ्रेमवर्क (उदाहरण के लिए राइनो मोक्स या Moq) का उपयोग करके "मजाक"।

इस दृष्टिकोण का उपयोग करके आप न केवल अपने नियंत्रक इकाई-परीक्षण योग्य बनाते हैं बल्कि बहुत ही कम युग्मित कोड के साथ समाप्त हो जाएंगे, जो लाभ बाद के विकास के लिए भुगतान कर सकता है।

2

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

लेकिन यदि आप निर्भरता का नकल करना चाहते हैं, तो आपको इसे SUT के अंदर नहीं बनाना चाहिए। इसे एसयूटी (कंस्ट्रक्टर, पैरामीटर इंजेक्शन की संपत्ति) में इंजेक्शन दिया जाना चाहिए।

तो, वापस अपने मामले के लिए:

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