Mocking the Controller Context using Rhino Mock

When using ASP.NET MVC 5, its easy to write unit tests around the framework due to the various abstractions provided.

Stephen Walther provides a good overview of the different objects. Whenever you need to interact with the request, response, session or browser, the following objects can be mocked using your mocking framework of choice:

  • HttpRequestBase
  • HttpResponseBase
  • HttpSessionBase
  • HttpBrowserCapabilitiesBase

Here of some examples using of mocking the various classes using Rhino Mock:

Mocking the Controller Context (MVC)

public void SetUpControllerContext()
{
// Setup the controller context plumbing
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
var httpRequest = MockRepository.GenerateMock<HttpRequestBase>();
var httpResponse = MockRepository.GenerateMock<HttpReponseBase>();
var browserMock = MockRepository.GenerateMock<HttpBrowserCapabilitiesBase>();
// Set the required test values
httpContext.Stub(h => h.Request.Browser).Return(browserMock);
httpContext.Stub(h => h.Request).Return(httpRequest);
// Now create the system under test
var repository = MockRepository.GenerateMock<Repository>();
var controller = new CustomerController(repository);
controller.ControllerContext = new ControllerContext(httpContext, new RouteData(), _controller);
controller.Create();
// Assertions
}
view raw gistfile1.cs hosted with ❤ by GitHub

Mocking the Controller Context (Web API)

var controller = new TestController();
var config = new HttpConfiguration();
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/test");
var route = config.Routes.MapHttpRoute("default", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "test" } });
controller.ControllerContext = new HttpControllerContext(config, routeData, request);
controller.Request = request;
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
view raw gistfile1.cs hosted with ❤ by GitHub

Mocking the Identity and Principal

public void SetUpHttpRequestUser()
{
// Setup the controller context plumbing
var httpContext = MockRepository.GenerateStub<HttpContextBase>();
var identity = MockRepository.GenerateStub<IIdentity>();
var principal = MockRepository.GenerateStub<IPrincipal>();
// Set the required test values
identity.Stub(i => i.Name).Return("TestUser");
principal.Stub(u => u.Identity).Return(identity);
httpContext.User = new GenericPrincipal(new GenericIdentity(String.Empty), new string[0]);
;
// Now create the system under test
var repository = MockRepository.GenerateMock<Repository>();
var controller = new CustomerController(repository);
var controller.ControllerContext = new ControllerContext(httpContext, new RouteData(), _controller);
controller.Create();
// Assertions
}
view raw gistfile1.cs hosted with ❤ by GitHub

Mocking the Session State

public void SetUpSession()
{
// Arrange
var httpContext = MockRepository.GenerateStub<HttpContextBase>();
var httpSession = MockRepository.GenerateStub<HttpSessionStateBase>();
httpContext.Stub(h => h.Session).Return(httpSession);
mock.Setup(p => p.HttpContext.Session).Returns(mockSession.Object);
// Now create the system under test
var repository = MockRepository.GenerateMock<Repository>();
var controller = new CustomerController(repository);
var controller.ControllerContext = new ControllerContext(httpContext, new RouteData(), _controller);
controller.Create();
// Assertions
Assert.AreEqual("testuser1", controller.HttpContext.Session["Username"]);
}
view raw gistfile1.cs hosted with ❤ by GitHub

Popular posts from this blog

A Simple 3 Layer Architecture