Mocking HttpContext with JustMock
        Posted  
        
            by mehfuzh
        on ASP.net Weblogs
        
        See other posts from ASP.net Weblogs
        
            or by mehfuzh
        
        
        
        Published on Thu, 29 Apr 2010 15:39:07 GMT
        Indexed on 
            2010/04/29
            15:47 UTC
        
        
        Read the original article
        Hit count: 503
        
In post , i will show 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 though ProcessRequest call, now if we take a look inside method though reflector, we will find calls stack like : ProcessRequest –> ProcessRequestWithNoAssert –> SetInstrinsics –> Finallly ProcessRequest. Inside SetIntrinsics , where it requires calls from HttpRequest, HttpResponse and HttpBrowserCababilities. With this , we can easily know what are classes / calls we need to mock in order to get though 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!!
© ASP.net Weblogs or respective owner