2012-12-03 46 views
10

मैं एक विधि के लिए कुछ यूनिट परीक्षण लिख रहा हूं जो एक पैरामीटर के रूप में एक HttpContext लेता है। मैं परीक्षण करना चाहता हूं कि जब अनुरोध एक पोस्ट है तो व्यवहार की अपेक्षा की जाती है।परीक्षण के लिए एक HttpContext का निर्माण, मैं कैसे निर्दिष्ट कर सकते हैं HttpRequest एक पोस्ट है?

सिस्टम बनाते समय .NET.HttpWebRequest विधि को सेट करना आसान है, लेकिन मैं System.Web.HttpRequest बनाने के दौरान विधि निर्दिष्ट करने का कोई तरीका नहीं देख सकता जो कि HttpContext में उपयोग किया जाता है।

कोई विचार?

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

सहायक विधि वर्तमान में:

private HttpContext GetHttpContext(string requestUrl) 
    { 
     var httpRequest = new HttpRequest("", requestUrl, "");    
     var stringWriter = new StringWriter(); 
     var httpResponce = new HttpResponse(stringWriter); 
     return new HttpContext(httpRequest, httpResponce); 
    } 
+0

HttpContext.Current.Request.HttpMethod का उपयोग करें। Http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod केवल एक गेटर है, न कि एक सेटटर, इसलिए परीक्षण के लिए काम नहीं करेगा। – mdchris

+1

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

उत्तर

5

मैं इकाई परीक्षण के लिए मजाक वस्तुओं पर शोध की सिफारिश करेंगे। .NET के लिए कुछ मॉकिंग फ्रेमवर्क उपलब्ध हैं जो इस प्रकार के परीक्षण की सुविधा प्रदान करते हैं।

उदाहरण के लिए, लेख here Moq ढांचे का उपयोग करके HttpMethod सेट करता है।

लेख से:

public ContextMocks(Controller onController, string HTTPMethod) 
{ 
    //... 
    Request = new Moq.Mock<HttpRequestBase>(); 
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod); 
    //... 
} 

जिसके अनुसार, अगर यह एक बंद परीक्षण है, और मुझे लगता है कि काफी तनाव नहीं कर सकते, और भूमि के ऊपर वस्तु मजाक शुरू करने से किए गए अपने विशेष स्थिति में अनावश्यक है

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST"); 

मैं पहले उल्लेख किया है, HttpContext, HttpRequest, आदि के साथ परीक्षण कर रहे हैं या एक आवर्ती विषय बन जाएगा, तो लाभ एक मजाक ढांचे के ले:, निम्नलिखित प्रतिबिंब HttpMethod सेट हो जाएगा। आप अपने आप को लंबे समय तक बचाएंगे।

+0

धन्यवाद, मैं कल रात इसके बारे में सोच रहा था और यह पता लगाया गया कि अगर कोई आसान तरीका नहीं है तो मुझे केवल प्रतिबिंब का उपयोग करना होगा, लेकिन अगर मैं संस्करण परिवर्तन के बाद मौजूदा निजी क्षेत्र की गारंटी नहीं देता तो उस विकल्प से बचना चाहता था। मुझे लगता है कि मजाक करना होगा जो मुझे करना होगा, बस उम्मीद थी कि इसकी आवश्यकता नहीं थी और मुझे बस कुछ याद आ रहा था। – mdchris

+0

ऐसा लगता है कि मैं प्रतिबिंब का उपयोग कर फंस गया हूं, HttpRequest सील कर दिया गया है, इसलिए मैं इसे नकल नहीं कर सकता। यह एक एमवीसी ऐप नहीं है, इसलिए संदर्भ HttpRequestBase के बजाय HttpRequest का उपयोग करता है ... – mdchris