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?