Playing with http page cycle using JustMock
- by mehfuzh
In this post , I will cover a test code that will mock the various elements needed to complete a HTTP page request and  assert the expected page cycle steps. To begin, i have a simple enumeration that has my predefined page steps:                          public enum PageStep           {               PreInit,               Load,               PreRender,               UnLoad           }                   Once doing so, i  first created the page object [not mocking].                          Page page = new Page();                   Here, our target is to fire up the page process through ProcessRequest call, now if we take a look inside the method with reflector.net,  the call trace will go like : ProcessRequest –> ProcessRequestWithNoAssert –> SetInstrinsics –> Finallly ProcessRequest. Inside SetInstrinsics ,  it requires calls from HttpRequest, HttpResponse and HttpBrowserCababilities. With this clue at hand, we can easily know the classes / calls  we need to mock in order to get through the expected call.   Accordingly, for  HttpBrowserCapabilities our required test code will look like:                          Mock.Arrange(() => browser.PreferredRenderingMime).Returns("text/html");           Mock.Arrange(() => browser.PreferredResponseEncoding).Returns("UTF-8");           Mock.Arrange(() => browser.PreferredRequestEncoding).Returns("UTF-8");                   Now, HttpBrowserCapabilities is get though [Instance]HttpRequest.Browser. Therefore, we create the HttpRequest mock:                          var request = Mock.Create<HttpRequest>();                   Then , add the required get call :                            Mock.Arrange(() => request.Browser).Returns(browser);                   As, [instance]Browser.PerferrredResponseEncoding and [instance]Browser.PreferredResponseEncoding  are also set to the request object and to make that they are set properly, we can add the following lines as well [not required though].                          bool requestContentEncodingSet = false;           Mock.ArrangeSet(() => request.ContentEncoding = Encoding.GetEncoding("UTF-8")).DoInstead(() =>  requestContentEncodingSet = true);                   Similarly, for response we can write:                                 var response = Mock.Create<HttpResponse>();                        bool responseContentEncodingSet = false;            Mock.ArrangeSet(() => response.ContentEncoding = Encoding.GetEncoding("UTF-8")).DoInstead(() => responseContentEncodingSet = true);                   Finally , I created a mock of HttpContext and set the Request and Response properties that will returns the mocked version.                          var context = Mock.Create<HttpContext>();                       Mock.Arrange(() => context.Request).Returns(request);           Mock.Arrange(() => context.Response).Returns(response);                   As, Page internally calls RenderControl method , we just need to replace that with our one and optionally we can check if  invoked properly:                          bool rendered = false;           Mock.Arrange(() => page.RenderControl(Arg.Any<HtmlTextWriter>())).DoInstead(() => rendered = true);                   That’s  it, the rest of the code is simple,  where  i asserted the page cycle with the PageSteps that i defined earlier:                          var pageSteps = new Queue<PageStep>();                        page.PreInit +=                delegate                {                    pageSteps.Enqueue(PageStep.PreInit);                };            page.Load +=                delegate                {                    pageSteps.Enqueue(PageStep.Load);                };                        page.PreRender +=                delegate                {                    pageSteps.Enqueue(PageStep.PreRender);                };                        page.Unload +=                delegate                {                    pageSteps.Enqueue(PageStep.UnLoad);                };                        page.ProcessRequest(context);                        Assert.True(requestContentEncodingSet);            Assert.True(responseContentEncodingSet);            Assert.True(rendered);                        Assert.Equal(pageSteps.Dequeue(), PageStep.PreInit);            Assert.Equal(pageSteps.Dequeue(), PageStep.Load);            Assert.Equal(pageSteps.Dequeue(), PageStep.PreRender);            Assert.Equal(pageSteps.Dequeue(), PageStep.UnLoad);                        Mock.Assert(request);            Mock.Assert(response);                      You can get the test class shown in this post here to give a try by yourself with of course JustMock :-).     Enjoy!!