所以这真的适用于几个不同的类,如HttpContext,ConfigurationManager等。有几种不同的方法来处理这个,我总是用包装类来处理这些东西,但我想看看最常见的社区实践是...
现在我有点做第一,所以我有一个HttpContextService和一个ConfigurationManagerService等,然后我注入了,虽然我将来倾向于2。 3对于我的口味来说似乎有点过于混乱,但我可以看到控制器方法的吸引力,并且对于使用这些静态类的其他代码区域需要一个完全独立的解决方案,这对我来说是一种穷人。 .. 4对我来说仍然很有趣,因为它在基本功能方面似乎是最“自然”的,并且利用了MVC的内置方法。
那么这里流行的最佳实践是什么?人们在野外看到和使用的是什么?
答案 0 :(得分:0)
已经为HttpContext,HttpRequest,HttpResponse等提供了“包装”类.MVC框架使用这些类,您可以通过控制器上下文向Controller提供它们的模拟。您不需要模拟控制器上下文,因为您可以使用适当的值创建一个。我发现很难模仿的唯一的东西是助手,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;
}
}