Уже существуют классы-оболочки для HttpContext, HttpRequest, HttpResponse и т. Д. Среда MVC использует их, и вы можете передавать их макеты в Контроллер через контекст контроллера. Вам не нужно имитировать контекст контроллера, так как вы можете просто создать его с соответствующими значениями. Единственное, что мне было трудно высмеять - это помощники, UrlHelper и HtmlHelper. Те имеют некоторые относительно глубокие зависимости. Вы можете подделать их несколько разумным способом, как показано ниже. UrlHelper.
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
var routeData = new RoutedData();
var controller = new HomeController();
controller.ControllerContext = new ControllerContext( httpContext, routeData, controller );
controller.Url = UrlHelperFactory.CreateUrlHelper( httpContext, routeDate );
, где
public static class UrlHelperFactory
{
public static UrlHelper CreateUrlHelper( HttpContextBase httpContext, RouteData routeData )
{
return CreateUrlHelper( httpContext, routeData, "/" );
}
public static UrlHelper CreateUrlHelper( HttpContextBase httpContext, RouteData routeData, string url )
{
string urlString = string.Format( "http://localhost/{0}/{1}/{2}", routeData.Values["controller"], routeData.Values["action"], routeData.Values["id"] ).TrimEnd( '/' );
var uri = new Uri( urlString );
if (httpContext.Request == null)
{
httpContext.Stub( c => c.Request ).Return( MockRepository.GenerateStub<HttpRequestBase>() ).Repeat.Any();
}
httpContext.Request.Stub( r => r.Url ).Return( uri ).Repeat.Any();
httpContext.Request.Stub( r => r.ApplicationPath ).Return( "/" ).Repeat.Any();
if (httpContext.Response == null)
{
httpContext.Stub( c => c.Response ).Return( MockRepository.GenerateStub<HttpResponseBase>() ).Repeat.Any();
}
if (url != "/")
{
url = url.TrimEnd( '/' );
}
httpContext.Response.Stub( r => r.ApplyAppPathModifier( Arg<string>.Is.Anything ) ).Return( url ).Repeat.Any();
return new UrlHelper( CreateRequestContext( httpContext, routeData ), GetRoutes() );
}
public static RequestContext CreateRequestContext( HttpContextBase httpContext, RouteData routeData )
{
return new RequestContext( httpContext, routeData );
}
// repeat your route definitions here!!!
public static RouteCollection GetRoutes()
{
RouteCollection routes = new RouteCollection();
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "home", action = "index", id = "" } // Parameter defaults
);
return routes;
}
}