2009-11-06 8 views
7

मैं हमेशा एएसपी.नेट में एटीपी.नेट एमवीसी/मोनोरेल में बहुत आसान एचटीपीकॉन्टेक्स्ट फिकिंग/मॉकिंग/स्टबिंग कर रहा हूं।क्यों इसे बनाया जा सकता है HttpContext नकली?

लेकिन मैं देख सकता हूं कि HttpContext को आसानी से कोड की कुछ पंक्तियों के साथ आसानी से बनाया जा सकता है।

var tw = new StringWriter(); 
var workerReq = new SimpleWorkerRequest("/webapp", @"c:\here\there\wwwroot", "page.aspx", tw); 
var context = new HtpContext(workerReq); 

अगर हम कुछ इस तरह इस कोड लपेटो जाएगा यह ठीक काम करना चाहिए, और शायद हम भी का उपयोग कर कि ASPX प्रदान कर सकते हैं:

using(Simulate.HttpContext()) { 
    HttpContext.Current.BlaBla; 
} 

तो प्रश्न हैं:

  1. कारणों को क्यों नहीं किया जाना चाहिए।
  2. कारणों को क्यों किया जाना चाहिए।
  3. इसका व्यापक रूप से उपयोग क्यों नहीं किया जाता है (वास्तव में मुझे इसके बारे में कोई भी पोस्ट याद नहीं है)।

मुझे एक पोस्ट याद है जहां फिल हैक ने प्रतिबिंब हैक्स का उपयोग करके एचटीपीकॉन्टेक्स्ट का निर्माण किया था।
लेकिन ऐसा लगता है कि इसकी आवश्यकता नहीं है।

चीयर्स,
दिमित्री।

उत्तर

5

यह बहुत आसान परीक्षण करने के लिए ठीक है, लेकिन आप एक घटक का परीक्षण कैसे करेंगे जो HttpRequest.Files का उपयोग करता है? जहां तक ​​मुझे पता है कि आप SimpleWorkerRequest पर इसे निर्दिष्ट करने की अनुमति देने के लिए कोई सार्वजनिक एपीआई नहीं हैं। भले ही आप एक ऐसा स्थान ढूंढ सकें जहां आप एक HttpFileCollection गुण सेट कर सकें, ध्यान दें कि उसका कन्स्ट्रक्टर आंतरिक है, इसलिए आप उस प्रकार का उदाहरण भी नहीं बना सकते हैं।

HttpRequest.Files इस संबंध में अकेले नहीं है, और वास्तव में वहाँ शायद कहीं अधिक बड़ी बातें कर रहे हैं आप कर सकते हैं की तुलना में आप कर सकते हैं परीक्षण वर्तमान HttpContext कार्यान्वयन के साथ नहीं परीक्षण। यह वह जगह है जहां अमूर्त वास्तव में काम में आते हैं।

2

विचार करने के लिए कुछ परिदृश्य हैं।

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

परिदृश्य दो: आप एकीकरण परीक्षण कर रहे हैं, जहां आप एक जटिल पृष्ठ की पीढ़ी की तरह कुछ बड़ा परीक्षण करने की कोशिश कर रहे हैं। इस मामले में, इसे वास्तविक HttpContent ऑब्जेक्ट को जिस तरह से मिला है उसे दें। आपका एकीकरण परीक्षण वास्तविक रनटाइम को बेहतर अनुकरण करेगा।

+0

मॉकिंग विशिष्ट त्रुटि स्थितियों तक पहुंचने के लिए भी बहुत अच्छा है। – dbn

0

कि काम हो सकता है, लेकिन ...

  • सबसे पहले मैं कुछ पथ, कि वातावरण में अलग हो सकता है देखते हैं।
  • दूसरी बात यह है कि आईआईएस स्थापित की तरह कुछ चाहिए?
  • इसे बनाने में कितना समय लगता है? अगर मेरे पास 100 परीक्षण हैं जो इसकी आवश्यकता है और इसमें 1 सेकंड लगते हैं, तो इसका मतलब है कि मेरा परीक्षण मिनट या उससे अधिक समय तक चलता है और इससे डेवलपर्स कम परीक्षण चलाते हैं।
  • परीक्षण परिदृश्य बनाने के लिए आप कैश, अनुरोध आदि को कितनी आसानी से नकल/सेटअप कर सकते हैं?

मॉकिंग/स्टबिंग शायद आसान है।

संपादित

मिले लिए कुछ स्रोत कोड HttpContext और मोनो परियोजना में SimpleWorkerRequest:

उन बेहतर जानकारी क्या निर्माण में हो रहा है दे सकते हैं । ASP.NET CreateApplicationHost/SimpleWorkerRequest API Hole

वास्तव में अच्छी तरह से दिखाता है कि हम समझने के लिए लागू करने से पहले उन वस्तु में हो रहा है की जरूरत है और यह समय लगता है:

एक लेख क्या रूप में अच्छी तरह उपयोगी हो सकता है मिले। मॉकिंग आसान लगता है।

+0

पथ: मुझे नहीं लगता कि वे वास्तव में उपयोग में हैं। आईआईएस: मुझे नहीं लगता कि इसकी भी आवश्यकता है। बनाने के लिए समय: मुझे लगता है कि यह किसी भी जटिल वस्तु से अधिक नहीं होना चाहिए। लेकिन अंतिम बिंदु (नकली कैश/अनुरोध) एक अच्छा है। –

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

  • कोई संबंधित समस्या नहीं^_^