my6solutions

asp .net, the social web & other distractions

 

Running Apps


PayPal - The safer, easier way to pay online!

Disclaimer

I am in no way affiliated with Microsoft or Google. I am just another developer trying to make a difference. All opinions and observations are usually my own.

Mocking HttpContext in ASP .NET MVC

One of the first few questions that someone starting to write unit tests for ASP .NET MVC would be "How do you mock HttpContext?". The following is done using Moq and creates a fake HttpContext to be passed to the MVC Controller.

public static HttpContextBase FakeHttpContext()

{

    var httpContext = new Mock<HttpContextBase>();

    var request = new Mock<HttpRequestBase>();

    var response = new Mock<HttpResponseBase>();

    var session = new Mock<HttpSessionStateBase>();

    var server = new Mock<HttpServerUtilityBase>();

    var cookies = new HttpCookieCollection();

 

    httpContext.Setup(x => x.Server).Returns(server.Object);

    httpContext.Setup(x => x.Session).Returns(session.Object);

    httpContext.Setup(x => x.Request).Returns(request.Object);

    httpContext.Setup(x => x.Response).Returns(response.Object);

    response.Setup(x => x.Cookies).Returns(cookies);

    httpContext.SetupGet(x => x.Request.Url).Returns(new Uri("http://test.com"));

    var writer = new StringWriter();

    var wr = new SimpleWorkerRequest("", "","","", writer);

    HttpContext.Current = new HttpContext(wr);

    return httpContext.Object;

}

The above creates mocks for HttpContext, HttpRequest, HttpResponse, cookies, and sessions as well as HttpContext.Current. FakeHttpContext is then used as follows to test the user registration controller.

var controller = new registerController();

var httpContext = TestHelpers.FakeHttpContext();

var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);

controller.ControllerContext = context;

var result = controller.Index("test", "test2", "test@test.com", "1234", "26", "5", "1976", "male") as RedirectToRouteResult;

Assert.IsNotNull(result);

Assert.AreEqual(result.RouteValues["action"], "edit");

Assert.AreEqual(result.RouteValues["controller"], "profile");

Simple? No?

Bookmark and Share

Categories: ASP .NET | TDD
Permalink | Comments (0) | Post RSSRSS comment feed