We recently changed some functionality where during the "CREATE" process, we go through a wizard to save application data. This data is saved only to the session in the final step when the user clicks the final submit.
References: http://stackoverflow.com/questions/9624242/setting-the-httpcontext-current-session-in-unit-test
This was easy enough to implement but when I started writing unit tests for my static methods that Add, Update, Delete or Modify the contents of our application data in the session, I got the following error:
System.NullReferenceException: Object reference not set to an instance of an object.
Turns out I had forgotten to setup the HttpContext.
The following "TestInitialise" method fixed my problem :)
[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); }
References: http://stackoverflow.com/questions/9624242/setting-the-httpcontext-current-session-in-unit-test
Great post man!. made my day today... thank you.
ReplyDeleteGlad to help.
ReplyDeleteFinally! This was just the post I needed. With all the dozens of posts on StackOverflow, they also forget about HttpContext. This nailed it on the head. Now I can get some actual work done today. :-)
ReplyDeleteFYI: These are the namespaces I needed ..
ReplyDeleteusing System.IO;
using System.Web;
using System.Web.SessionState;
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
Great ! You really saved my day.
ReplyDeleteThanks a lot.