2008-10-27 17 views
10

मैं HttpContext को नकल करने की कोशिश कर रहा हूं ताकि मैं अपने नियंत्रक के अनुरोध का परीक्षण कर सकूं। Iututicated कॉल। मैं rhino.mocks का उपयोग कर HttpContext अनुकरण करने के लिए code that I found at Scott Hanselman's ब्लॉग का उपयोग कर रहा हूं। तो मैं इस इकाई परीक्षण टुकड़ा:मॉकिंग HttpContext काम नहीं करता

PostsController postsController = new PostsController(postDL); 
mocks.SetFakeControllerContext(postsController); 
Expect.Call(postsController.Request.IsAuthenticated).Return(true); 

मेरी नियंत्रक कार्रवाई में, मैं कुछ की तरह if(Request.IsAuthenticated).... जब मैं इकाई परीक्षण चलाने का प्रयास, परीक्षण एक अशक्त अपवाद फेंकने में विफल रहता है, और जब मैं करने की कोशिश इकाई परीक्षण डीबग करें, मुझे लगता है कि HttpContext को कभी नियंत्रक को असाइन नहीं किया गया है। कोई विचार?

उत्तर

0

अब, प्रकटीकरण के लिए, मैं अभी तक अपने हाथ सामान आप के साथ काम कर रहे हैं, तथापि से अधिकांश के साथ गंदा पाने के लिए है:

आप IsAuthenticated नकली चाहते हैं, यही कारण है कि सिर्फ एक स्थिर वर्ग वापस जाने के लिए नहीं बना एक बूल जिसे आपके टेस्ट कोड द्वारा छेड़छाड़ की जा सकती है?

इसमें कुछ समय किसी न किसी दौर किनारों है, लेकिन उम्मीद है कि आपको अंदाजा हो:

interface IAuthenticationChecker 
{ 
    bool IsAuthenticated { get; } 
} 

public class MockAuthenticationChecker : IAuthenticationChecker 
{ 
    static bool _authenticated = false; 

    public static void SetAuthenticated(bool value) 
    { 
     _authenticated = value; 
    } 
    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { return _authenticated; } 
    } 

    #endregion 
} 

public class RequestAuthenticationChecker : IAuthenticationChecker 
{ 

    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { 
      if (HttpContext.Current == null) 
       throw new ApplicationException(
        "Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext."); 

      return HttpContext.Current.Request.IsAuthenticated; 
     } 
    } 

    #endregion 
} 

फिर आप या तो ऐप्लिकेशन स्तर पर एक संदर्भ का उपयोग कर सकते है, हाँ यह मतलब है कि आप एप्लिकेशन पर एक संदर्भ जोड़ने के लिए स्तर, और आपको अनुरोध के बजाय एक अलग रेफरी का उपयोग करने की आवश्यकता है, लेकिन आपको परीक्षण के लिए प्रमाणीकरण पर पूर्ण नियंत्रण भी मिलता है :)

एफवाईआई - यह अलग होने के लिए पूरी तरह से खुला है, मैंने इसे लगभग एक मिनट में फेंक दिया :)

2

यह कुछ उपयोग हो सकता है आप, एक ऐसी ही स्थिति में मेरे लिए काम किया:

http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

+0

यह आप HttpContextBase और संबंधित सार आधार वर्ग –

+0

स्रोत के लिए लिंक नहीं है जब के लिए एक जानवर बल विधि – Juri

+0

कोशिश ई काम नहीं करता है मेलिंग फिल अपनी साइट के माध्यम से - http://haacked.com/contact.aspx – Kieron

8

यह काम करना चाहिए:

PostsController postsController = new PostsController(postDL); 
var context = mocks.Stub<HttpContextBase>(); 
var request = mocks.Stub<HttpRequestBase>(); 
SetupResult.For(request.IsAuthenticated).Return(true); 
SetupResult.For(context.Request).Return(request);  
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController); 
0

यहां नकली संदर्भ के लिए एक आसान तरीका है, पाया गया Jeff's blog से:

 TextWriter tw = new StringWriter(); 
     HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw); 
     HttpContext.Current = new HttpContext(wr); 
0

यहां कक्षा कि उपयोगी हो सकता है है। यह ajax अनुरोध, उपयोगकर्ता प्रमाणीकरण, अनुरोध पैरामीटर और संभालती अधिक: https://gist.github.com/3004119

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