Last active
August 20, 2019 16:13
-
-
Save crmckenzie/40be5d032dcb99481445 to your computer and use it in GitHub Desktop.
Faking Controller Context
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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