2009-04-01 20 views
7

मैं फ्रेमवर्क का मज़ाक लगाने के लिए नया हूं और मेरे एमवीसी ऐप यूनिट परीक्षण में सहायता के लिए राइनोमोक्स का उपयोग करना शुरू कर दिया है।राइनो मोक्स का उपयोग करने के लिए कैसे करें HttpContext.Aplication

मैं HttpContext का मज़ाक उड़ाते हुए Scott Hanselmanns MVC Mock Helper का उपयोग कर रहा हूं। मैंने सफलतापूर्वक (कुछ समय बाद) कुछ चीज़ों की नकल की है जो मुझे चाहिए लेकिन एचटीपी कॉनटेक्स्ट की एप्लिकेशन प्रॉपर्टी की बात आती है।

अपने आवेदन में मैं आवेदन में एक वस्तु की दुकान और की तरह एक नियंत्रक के भीतर इसे पुनः प्राप्त:

SomeObj foo = (SomeObj)Application["fooKey"]; 

यह मेरा MVC App में Application_Start पर बनाया जाता है।

पहले उत्तर (स्पष्टता के लिए अतिरिक्त कोड) वर्तमान में परीक्षण सेटअप में निम्नलिखित UPDATED मुझे क्या करना:

HttpContextBase mockHttpBase = mocks.FakeHttpContext(); 
controllerToTest = new SomeController(); 
mocks.SetFakeControllerContext(controllerToTest); 


HttpApplicationStateBase appState = 
    MockRepository.GenerateStub<HttpApplicationStateBase>(); 

Globals tmpAppGlobals = 
    new Globals(); 

mockHttpBase.Expect(ctx => ctx.Application).Return(appState); 
mockHttpBase.Expect(ctx => ctx.Application[Globals.GlobalsKey]). 
    Return(tmpAppGlobals); 

मेरी इकाई परीक्षण सेटअप में मुझे क्या करना:

Globals tmpAppGlobals = new Globals(); 
controllerToTest.ControllerContext.HttpContext. 
      Expect(ctx => ctx.Application[Globals.GlobalsKey]). 
Return(tmpAppGlobals); 

इस कॉल फेंकता एप्लिकेशन ऑब्जेक्ट के लिए एक NullReference अपवाद।

मेरा प्रश्न है दो गुना:

1) क्या यह सही दृष्टिकोण या मैं कुछ एक डिजाइन/वास्तुकला के नजरिए से गलत किया है है?

2) यह क्यों काम नहीं करता है ?!

धन्यवाद, अग्रिम में।

+1

मैंने अपना जवाब संपादित कर लिया है; इसे जांचें और देखें कि यह – Randolpho

उत्तर

1

बहुत गहराई से बहने के बिना, यह अधिकतर सही दिखता है।

एप्लिकेशन प्रॉपर्टी HttpContextBase पर आभासी है, इसलिए आप राइनो से इसके लिए रिटर्न वैल्यू सेट अप करने में सक्षम होना चाहिए - मान लीजिए कि आप स्कॉट हंसेलमैन पोस्ट के रूप में HttpContextBase का मज़ाक उड़ा रहे हैं।

कुछ संभावित कारणों, जो वास्तव में सिर्फ जानकारी की कमी से अनुमान लगा लेता रहे हैं:

  • आप controllerToTest.ControllerContext के लिए रिटर्न सेट किया है?
  • क्या आपने के लिए वापसी की है कि ऑब्जेक्ट्स HttpContext प्रॉपर्टी?
  • क्या आपने के लिए वापसी की है कि ऑब्जेक्ट्स एप्लिकेशन प्रॉपर्टी?

कारण मैं पूछता हूं कि आम तौर पर जब आप उम्मीद सेटअप करते हैं, तो आपके पास पहले से ही उन वस्तुओं के संदर्भ हैं जिन्हें आपके परीक्षण के हिस्से के रूप में बुलाया जाएगा, इसलिए आप अपनी संपत्ति श्रृंखला नहीं करेंगे जैसे आप अपने साथ करते हैं controllerToTest.ControllerContext.HttpContext. Expect() कॉल करें।

संपादित करें:

मुझे लगता है कि मैं इस समस्या देखते हैं, और मुझे लगता है कि इस भाग के साथ है:

Expect(ctx => ctx.Application[Globals.GlobalsKey])

मुझे लगता है कि आप यह सोचते हैं कर रहे हैं कि indexers गुण के रूप में ही काम करते हैं, जब वे नहीं करते हैं। क्या तुम सच में करने के लिए इस तरह, मद संपत्ति के लिए एक कॉल प्राप्त करने के लिए अपने appState वस्तु पर एक उम्मीद की स्थापना की है की जरूरत है:

// setup expectations -- assumes some of the expectations and mocks 
// the from original question 
mockHttpBase.Expect(ctx => ctx.Application).Return(appState); 
appState.Expect(ctx => ctx.Item(Globals.GlobalsKey)).Return(tmpAppGlobals); 

// run the test 
+1

रैंडोल्फो, धन्यवाद। मैंने नियंत्रक संदर्भ, httpContext और एप्लिकेशन [मुझे लगता है] के लिए रिटर्न सेट किया है। मैंने स्पष्टता के लिए कुछ अतिरिक्त कोड जोड़ा है। – Lewis

+0

ओह, मैं देखता हूं; मैंने पूरी तरह से ब्लॉग पोस्ट नहीं पढ़ा। – Randolpho

+0

धन्यवाद फिर से रैंडोल्फो। दुर्भाग्यवश, मैं काम करने के लिए आपका उदाहरण नहीं मिला। मैंने तब से अपने स्वयं के मॉक ऑब्जेक्ट्स को HttpContext और बच्चे ऑब्जेक्ट्स के लिए लिखने के लिए वापस कर दिया है और इस तरह से काम करने में और अधिक सफलता प्राप्त कर रहा हूं। – Lewis

1

आप Moq के लिए नीचे इस्तेमाल कर सकते हैं। मुझे थोड़ी देर लग गई कि कैसे Http अनुप्रयोग को नकल करना है, और appState.Object वापसी विधि duh है!

public static HttpContextBase FakeHttpContext() 
    { 
     var context = new Mock<HttpContextBase>(); 
     var request = new Mock<HttpRequestBase>(); 
     var response = new Mock<HttpResponseBase>(); 
     var session = new FakeHttpSessionState(); 
     var server = new Mock<HttpServerUtilityBase>(); 
     var appState = new Mock<HttpApplicationStateBase>(); 

     context.Setup(ctx => ctx.Request).Returns(request.Object); 
     context.Setup(ctx => ctx.Response).Returns(response.Object); 
     context.Setup(ctx => ctx.Session).Returns(session); 
     context.Setup(ctx => ctx.Server).Returns(server.Object); 
     context.Setup(ctx => ctx.Application).Returns(appState.Object); 

     //emulate session (HttpContext.Current.Session) 
     var contx = new HttpContext(new MyApp.NUnit.Tests.Fakes.FakeHttpWorkerRequest()); 
     contx.Items["AspSession"] = CreateSession(); 

     HttpContext.Current = contx; 

     return context.Object; 
    } 
+2

क्षमा करें मैं घना हूं जहां "FakeHttpSessionState" और "CreateSession" परिभाषित किया गया है? – CmdrTallen

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