दिलचस्प पोस्ट
मेरे प्रोजेक्ट में कोई जेनरेट नहीं हुई आर.जेवा फाइल स्टोरीबोर्ड में कस्टम फोंट? बूटस्ट्रैप 3 – अक्षमबार पतन अक्षम करें मैं प्रगतिबार पर पाठ कैसे डाल सकता हूं? रिच टेक्स्टबॉक्स स्ट्रिंग के विभिन्न भागों का रंग आईपैड मिनी स्क्रीन आकार के साथ लेनदेन Firebase डेटाबेस में स्ट्रिंग में एक साधारण खोज कैसे करें? sed या awk: एक पैटर्न के बाद n लाइनों को हटा दें awk या sed के साथ एक कॉलम हटाएं मैं 512 एम से अधिक ग्रहण कैसे दे सकता हूं? कोड के एक पाइप ब्लॉक के अंदर क्यों विलंब का विस्तार विफल हो जाता है? Android M कैमरा आशय + अनुमति बग? sed कमांड के साथ -i विकल्प मैक पर असफल हो रहा है, लेकिन लिनक्स पर काम करता है MVC प्रगति बार थ्रेडिंग प्रतिस्थापन का उपयोग करते समय जावास्क्रिप्ट केवल पहला उदाहरण क्यों बदलता है?

एक इकाई परीक्षण में HttpContext.Current.Session सेट

मेरे पास एक वेब सेवा है, मैं इकाई परीक्षण की कोशिश कर रहा हूं। सेवा में यह एचटीटीपी कॉन्टैक्ट से कई मान खींचती है जैसे:

m_password = (string)HttpContext.Current.Session["CustomerId"]; m_userID = (string)HttpContext.Current.Session["CustomerUrl"]; 

यूनिट परीक्षण में मैं साधारण कार्यकर्ता अनुरोध का उपयोग करते हुए संदर्भ बना रहा हूं, जैसे:

 SimpleWorkerRequest request = new SimpleWorkerRequest("", "", "", null, new StringWriter()); HttpContext context = new HttpContext(request); HttpContext.Current = context; 

हालांकि, जब भी मैं HttpContext के मूल्यों को सेट करने की कोशिश करता हूँ। वर्तमान सत्र

 HttpContext.Current.Session["CustomerId"] = "customer1"; HttpContext.Current.Session["CustomerUrl"] = "customer1Url"; 

मैं अशक्त संदर्भ अपवाद मिलता है जो एचटीटीपी कंसोर्ट। कहते हैं। सत्र। सत्र शून्य है। क्या यूनिट टेस्ट में मौजूदा सत्र को प्रारंभ करने का कोई तरीका है?

वेब के समाधान से एकत्रित समाधान "एक इकाई परीक्षण में HttpContext.Current.Session सेट"

हमें HttpContext का उपयोग करके HttpContext का मज़ाक उड़ाया था और कारखाने को हमारे आवेदन के साथ ही यूनिट टेस्ट के भीतर बुला रहा था

 public class HttpContextManager { private static HttpContextBase m_context; public static HttpContextBase Current { get { if (m_context != null) return m_context; if (HttpContext.Current == null) throw new InvalidOperationException("HttpContext not available"); return new HttpContextWrapper(HttpContext.Current); } } public static void SetCurrentContext(HttpContextBase context) { m_context = context; } } 

फिर आप HttpContext.Current को किसी भी कॉल की HttpContext.Current साथ वर्तमान और उसी विधि का उपयोग कर सकते हैं। तब जब आप परीक्षण कर रहे हैं, तो आप HttpContextManager उपयोग कर सकते हैं और अपनी उम्मीदों का नकली कर सकते हैं

यह Moq का उपयोग करते हुए एक उदाहरण है:

 private HttpContextBase GetMockedHttpContext() { var context = new Mock<HttpContextBase>(); var request = new Mock<HttpRequestBase>(); var response = new Mock<HttpResponseBase>(); var session = new Mock<HttpSessionStateBase>(); var server = new Mock<HttpServerUtilityBase>(); var user = new Mock<IPrincipal>(); var identity = new Mock<IIdentity>(); var urlHelper = new Mock<UrlHelper>(); var routes = new RouteCollection(); MvcApplication.RegisterRoutes(routes); var requestContext = new Mock<RequestContext>(); requestContext.Setup(x => x.HttpContext).Returns(context.Object); context.Setup(ctx => ctx.Request).Returns(request.Object); context.Setup(ctx => ctx.Response).Returns(response.Object); context.Setup(ctx => ctx.Session).Returns(session.Object); context.Setup(ctx => ctx.Server).Returns(server.Object); context.Setup(ctx => ctx.User).Returns(user.Object); user.Setup(ctx => ctx.Identity).Returns(identity.Object); identity.Setup(id => id.IsAuthenticated).Returns(true); identity.Setup(id => id.Name).Returns("test"); request.Setup(req => req.Url).Returns(new Uri("http://www.google.com")); request.Setup(req => req.RequestContext).Returns(requestContext.Object); requestContext.Setup(x => x.RouteData).Returns(new RouteData()); request.SetupGet(req => req.Headers).Returns(new NameValueCollection()); return context.Object; } 

और फिर इसे अपने यूनिट परीक्षणों के भीतर उपयोग करने के लिए, मैं इसे अपने टेस्ट इनिट विधि के भीतर कॉल करता हूं

 HttpContextManager.SetCurrentContext(GetMockedHttpContext()); 

तब आप उपरोक्त विधि में सत्र से अपेक्षित परिणाम जोड़ सकते हैं जिसे आप अपने वेब सेवा के लिए उपलब्ध होने की उम्मीद कर रहे हैं।

आप इस तरह एक नया एचटीटीपी कॉन्टैक्ट बनाने के द्वारा "यह नकली" कर सकते हैं:

http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx

मैंने उस कोड को लिया है और इसे एक स्थिर सहायक वर्ग पर रखा है:

 public static HttpContext FakeHttpContext() { var httpRequest = new HttpRequest("", "http://stackoverflow/", ""); var stringWriter = new StringWriter(); var httpResponse = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponse); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Standard, new[] { typeof(HttpSessionStateContainer) }, null) .Invoke(new object[] { sessionContainer }); return httpContext; } 

या नए HttpSessionState उदाहरण का निर्माण करने के लिए प्रतिबिंब के उपयोग के बजाय, आप अपने HttpSessionStateContainer को HttpSessionStateContainer (ब्रेंट एम। स्पेल की टिप्पणी के अनुसार) से संलग्न कर सकते हैं:

 SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer); 

और फिर आप इसे अपने यूनिट परीक्षणों में कॉल कर सकते हैं जैसे:

 HttpContext.Current = MockHelper.FakeHttpContext(); 

मिल्कोक्स समाधान एक स्वीकृत आईएमएचओ से बेहतर है, लेकिन इस क्रियान्वयन के साथ कुछ समस्याएं थीं, जब यूआरएल को क्विकस्ट्रिंग से संभाला था ।

मैंने इसे कुछ यूआरएल के साथ ठीक से काम करने के लिए और प्रतिबिंब से बचने के लिए कुछ बदलाव किए हैं।

 public static HttpContext FakeHttpContext(string url) { var uri = new Uri(url); var httpRequest = new HttpRequest(string.Empty, uri.ToString(), uri.Query.TrimStart('?')); var stringWriter = new StringWriter(); var httpResponse = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponse); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); SessionStateUtility.AddHttpSessionStateToContext( httpContext, sessionContainer); return httpContext; } 

मैं थोड़ी देर पहले इस बारे में कुछ कहता हूं।

यूनिट परीक्षण HttpContext.Current.SVC में MVC3। नेट

आशा करता हूँ की ये काम करेगा।

 [TestInitialize] public void TestSetup() { // We need to setup the Current HTTP Context as follows: // Step 1: Setup the HTTP Request var httpRequest = new HttpRequest("", "http://localhost/", ""); // Step 2: Setup the HTTP Response var httpResponce = new HttpResponse(new StringWriter()); // Step 3: Setup the Http Context var httpContext = new HttpContext(httpRequest, httpResponce); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); httpContext.Items["AspSession"] = typeof(HttpSessionState) .GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, CallingConventions.Standard, new[] { typeof(HttpSessionStateContainer) }, null) .Invoke(new object[] { sessionContainer }); // Step 4: Assign the Context HttpContext.Current = httpContext; } [TestMethod] public void BasicTest_Push_Item_Into_Session() { // Arrange var itemValue = "RandomItemValue"; var itemKey = "RandomItemKey"; // Act HttpContext.Current.Session.Add(itemKey, itemValue); // Assert Assert.AreEqual(HttpContext.Current.Session[itemKey], itemValue); } 

यदि आप एमवीसी फ्रेमवर्क का उपयोग कर रहे हैं, तो यह काम करना चाहिए मैं मिल्क्स की नकली एचटीटीपी कॉन्टैक्ट का इस्तेमाल किया और कोड की कुछ अतिरिक्त लाइनें जोड़ दीं। विचार इस पोस्ट से आया है:

http://codepaste.net/p269t8

यह एमवीसी 5 में काम करने लगता है। मैंने इसे एमवीसी के पिछले संस्करणों में नहीं करने की कोशिश की है।

 HttpContext.Current = MockHttpContext.FakeHttpContext(); var wrapper = new HttpContextWrapper(HttpContext.Current); MyController controller = new MyController(); controller.ControllerContext = new ControllerContext(wrapper, new RouteData(), controller); string result = controller.MyMethod(); 

आप FakeHttpContext का प्रयास कर सकते हैं:

 using (new FakeHttpContext()) { HttpContext.Current.Session["CustomerId"] = "customer1"; } 

मेरे साथ काम करने वाले उत्तर एंथनी ने क्या लिखा था, लेकिन आपको एक और पंक्ति जोड़नी होगी जो है

  request.SetupGet(req => req.Headers).Returns(new NameValueCollection()); 

तो आप इसका उपयोग कर सकते हैं:

 HttpContextFactory.Current.Request.Headers.Add(key, value); 

Asp.net कोर / एमवीसी 6 आरसी 2 में आप एचटीटीपीसीओन्टेक्स सेट कर सकते हैं

 var SomeController controller = new SomeController(); controller.ControllerContext = new ControllerContext(); controller.ControllerContext.HttpContext = new DefaultHttpContext(); controller.HttpContext.Session = new DummySession(); 

आर सी 1 था

 var SomeController controller = new SomeController(); controller.ActionContext = new ActionContext(); controller.ActionContext.HttpContext = new DefaultHttpContext(); controller.HttpContext.Session = new DummySession(); 

https://stackoverflow.com/a/34022964/516748

Moq का उपयोग करने पर विचार करें

 new Mock<ISession>(); 

इसे इस्तेमाल करे:

  // MockHttpSession Setup var session = new MockHttpSession(); // MockHttpRequest Setup - mock AJAX request var httpRequest = new Mock<HttpRequestBase>(); // Setup this part of the HTTP request for AJAX calls httpRequest.Setup(req => req["X-Requested-With"]).Returns("XMLHttpRequest"); // MockHttpContextBase Setup - mock request, cache, and session var httpContext = new Mock<HttpContextBase>(); httpContext.Setup(ctx => ctx.Request).Returns(httpRequest.Object); httpContext.Setup(ctx => ctx.Cache).Returns(HttpRuntime.Cache); httpContext.Setup(ctx => ctx.Session).Returns(session); // MockHttpContext for cache var contextRequest = new HttpRequest("", "http://localhost/", ""); var contextResponse = new HttpResponse(new StringWriter()); HttpContext.Current = new HttpContext(contextRequest, contextResponse); // MockControllerContext Setup var context = new Mock<ControllerContext>(); context.Setup(ctx => ctx.HttpContext).Returns(httpContext.Object); //TODO: Create new controller here // Set controller's ControllerContext to context.Object 

और कक्षा जोड़ें:

 public class MockHttpSession : HttpSessionStateBase { Dictionary<string, object> _sessionDictionary = new Dictionary<string, object>(); public override object this[string name] { get { return _sessionDictionary.ContainsKey(name) ? _sessionDictionary[name] : null; } set { _sessionDictionary[name] = value; } } public override void Abandon() { var keys = new List<string>(); foreach (var kvp in _sessionDictionary) { keys.Add(kvp.Key); } foreach (var key in keys) { _sessionDictionary.Remove(key); } } public override void Clear() { var keys = new List<string>(); foreach (var kvp in _sessionDictionary) { keys.Add(kvp.Key); } foreach(var key in keys) { _sessionDictionary.Remove(key); } } } 

यह आपको सत्र और कैश दोनों के साथ परीक्षण करने की अनुमति देगा।

मैं ऊपर उल्लिखित विकल्पों की तुलना में थोड़ा कम आक्रामक खोज रहा था। अंत में मैं एक पनीर के समाधान के साथ आया था, लेकिन यह कुछ लोगों को थोड़ी तेजी से आगे बढ़ने के लिए मिल सकता है।

सबसे पहले मैंने एक परीक्षण सत्र बनाया:

 class TestSession : ISession { public TestSession() { Values = new Dictionary<string, byte[]>(); } public string Id { get { return "session_id"; } } public bool IsAvailable { get { return true; } } public IEnumerable<string> Keys { get { return Values.Keys; } } public Dictionary<string, byte[]> Values { get; set; } public void Clear() { Values.Clear(); } public Task CommitAsync() { throw new NotImplementedException(); } public Task LoadAsync() { throw new NotImplementedException(); } public void Remove(string key) { Values.Remove(key); } public void Set(string key, byte[] value) { if (Values.ContainsKey(key)) { Remove(key); } Values.Add(key, value); } public bool TryGetValue(string key, out byte[] value) { if (Values.ContainsKey(key)) { value = Values[key]; return true; } value = new byte[0]; return false; } } 

फिर मैंने अपने नियंत्रक के निर्माता को एक वैकल्पिक पैरामीटर जोड़ा। यदि पैरामीटर मौजूद है, तो सत्र हेरफेर के लिए इसका उपयोग करें। अन्यथा, HttpContext.Session का उपयोग करें:

 class MyController { private readonly ISession _session; public MyController(ISession session = null) { _session = session; } public IActionResult Action1() { Session().SetString("Key", "Value"); View(); } public IActionResult Action2() { ViewBag.Key = Session().GetString("Key"); View(); } private ISession Session() { return _session ?? HttpContext.Session; } } 

अब मैं अपने परीक्षण सत्र को नियंत्रक में इंजेक्ट कर सकता हूं:

 class MyControllerTest { private readonly MyController _controller; public MyControllerTest() { var testSession = new TestSession(); var _controller = new MyController(testSession); } } 

जवाब @ रॉट हिट ने मुझे बहुत मदद की, लेकिन मुझे यूज़र क्रेडेंशियल्स याद आ रही थी क्योंकि मुझे प्रमाणीकरण इकाई परीक्षण के लिए नकली उपयोगकर्ता था। इसलिए, मुझे बताएं कि मैंने इसे कैसे हल किया।

इस के अनुसार, यदि आप विधि जोड़ें

  // using System.Security.Principal; GenericPrincipal FakeUser(string userName) { var fakeIdentity = new GenericIdentity(userName); var principal = new GenericPrincipal(fakeIdentity, null); return principal; } 

और फिर संलग्न करें

  HttpContext.Current.User = FakeUser("myDomain\\myUser"); 

आपके द्वारा किए गए TestSetup विधि की अंतिम पंक्ति के लिए, उपयोगकर्ता क्रेडेंशियल जोड़ दिए गए हैं और प्रमाणीकरण परीक्षण के लिए उपयोग करने के लिए तैयार हैं।

मुझे यह भी पता चला है कि .MapPath() में अन्य भागों हैं जिनके लिए आपको आवश्यकता हो सकती है, जैसे कि .MapPath() विधि। यहां एक नकली एचटीटीपीकॉन्टेक्स्ट उपलब्ध है, जो यहां वर्णित है और न्यूगेट के माध्यम से इंस्टॉल किया जा सकता है।