Skip to content

Instantly share code, notes, and snippets.

@crmckenzie
Last active August 20, 2019 16:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save crmckenzie/40be5d032dcb99481445 to your computer and use it in GitHub Desktop.
Save crmckenzie/40be5d032dcb99481445 to your computer and use it in GitHub Desktop.
Faking Controller Context
public static class Fakes
{
public static UrlHelper FakeUrlHelper(HttpContextBase httpContext, RouteData routeData, RouteCollection routeCollection)
{
var requestContext = new RequestContext(httpContext, routeData);
var urlHelper = new UrlHelper(requestContext, routeCollection);
return urlHelper;
}
public static RouteCollection GetRouteCollection()
{
var routes = new RouteCollection();
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
)
;
return routes;
}
public static HttpContextBase FakeHttpContext()
{
var context = Substitute.For<HttpContextBase>();
var request = FakeHttpRequest();
var response = FakeHttpResponse();
var session = Substitute.For<HttpSessionStateBase>();
var server = Substitute.For<HttpServerUtilityBase>();
context.Request.Returns(request);
context.Response.Returns(response);
context.Session.Returns(session);
context.Server.Returns(server);
return context;
}
private static HttpResponseBase FakeHttpResponse()
{
var response = Substitute.For<HttpResponseBase>();
response.ApplyAppPathModifier(Arg.Any<string>()).Returns(ci => ci.Arg<string>());
return response;
}
private static HttpRequestBase FakeHttpRequest()
{
var request = Substitute.For<HttpRequestBase>();
request.AppRelativeCurrentExecutionFilePath.Returns("/");
request.ApplicationPath.Returns("/");
request.Url.Returns(new Uri("http://localhost", UriKind.Absolute));
request.ServerVariables.Returns(new NameValueCollection());
return request;
}
public static RouteData CreateRouteData<T>() where T : Controller
{
var routeData = new RouteData();
routeData.Values.Add("controller", "Home");
routeData.Values.Add("action", "Index");
return routeData;
}
}
public static class ControllerExtensions
{
public static T Fake<T>(this T controller, IKernel kernel) where T : Controller
{
var httpContextBase = kernel.Get<HttpContextBase>();
return controller.Fake(httpContextBase);
}
public static T Fake<T>(this T controller, HttpContextBase fakeHttpContext = null) where T : Controller
{
var routeCollection = Fakes.GetRouteCollection();
new AreaRegistrationContext("Admin", routeCollection);
if (fakeHttpContext == null)
fakeHttpContext = Fakes.FakeHttpContext();
var routeData = Fakes.CreateRouteData<T>();
controller.ControllerContext = new ControllerContext(fakeHttpContext, routeData, controller);
controller.Url = Fakes.FakeUrlHelper(fakeHttpContext, routeData, routeCollection);
return controller;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment