2010-08-13 12 views
6

मैं एक यूनिट परीक्षण लिखना चाहता हूं जो अपलोडेडफाइल नामक कक्षा के फ़ंक्शन का परीक्षण करता है।मैं अपने यूनिट टेस्ट द्वारा उपयोग किए जाने के लिए HttpContext को कैसे उपलब्ध कर सकता हूं?

मुझे जिस समस्या का सामना करना पड़ता है वह इस वर्ग का स्थिर कन्स्ट्रक्टर HttpContext.Current प्रॉपर्टी का उपयोग करता है और क्योंकि मैं कक्षा पुस्तकालय से अपना यूनिट परीक्षण चला रहा हूं, मेरे पास परीक्षण समय पर एक HttpContext नहीं है। मेरी स्थिर निर्माता पर

देखो:

static UploadedFile() 
{ 
    if (HttpContext.Current == null) 
     throw new Exception("web server not available"); 

    HttpServerUtility server = HttpContext.Current.Server; 

    // SET UploadedFileMappingFile Names: 
    _resourceFileNames = new StringDictionary(); 

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures); 
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD); 

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);   
} 

मैं अपने परीक्षण वातावरण में क्या करना चाहिए ताकि HttpContext.Current रिक्त नहीं हो जाएगा और मैं सफलतापूर्वक सेट कर सकते हैं इस:

HttpServerUtility server = HttpContext.Current.Server; 

उत्तर

10

आप shouldn ' टी HttpContext.Current सीधे अपने फ़ंक्शन में उपयोग करें क्योंकि यह यूनिट परीक्षण के लिए असंभव है, जैसा कि आप पहले ही पा चुके हैं। मैं आपको HttpContextBase का उपयोग करने का सुझाव दूंगा, जो कि आपकी कक्षा के निर्माता में या आपके द्वारा परीक्षण की जा रही विधि के लिए तर्क के रूप में पारित किया गया है। यह इस कक्षा के उपभोक्ताओं को वास्तविक HttpContextWrapper पास करने की अनुमति देगा और आपके यूनिट परीक्षण में आप जिस तरीके की आवश्यकता हो, उसका नकल कर सकते हैं।

var wrapper = new HttpContextWrapper(HttpContext.Current); 
Foo.UploadedFile(wrapper); 

और अपने इकाई परीक्षण में (Rhino Mocks उपयोग करते हुए):

var contextMock = MockRepository.GenerateMock<HttpContextBase>(); 
// TODO: Define expectations on the mocked object 
Foo.UploadedFile(contextMock); 

या, यदि आप पसंद करते हैं, Constructor Injection का उपयोग

उदाहरण के लिए आप निम्न तरीके से विधि कह सकते है।

+0

विचार के लिए धन्यवाद! मैंने अब तक दुर्भाग्य से Rhino.Mocks.dll का उपयोग नहीं किया है। ऐसा लगता है कि मुझे पहले इससे परिचित होना है, तो मैं आपके सुझाव को लागू करने की कोशिश करूंगा। धन्यवाद! – pencilCake

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

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