我发现自己在测试中使用了“魔术字符串”网址,这是我不喜欢的.
[Given(@"I am on the sign up page")]public voID GivenIAmOnTheSignUpPage(){ string rootUrl = ConfigurationManager.AppSettings["RootUrl"]; string fullUrl = string.Format("{0}/Authentication/Signup",rootUrl); Webbrowser.Current.GoTo(fullUrl);}
我更喜欢使用我的T4MVC动作结果,就像我在MVC应用程序中那样,这样的……
[Given(@"I am on the sign up page")]public voID GivenIAmOnTheSignUpPage(){ Webbrowser.Current.GoTo(MVC.Authentication.SignUp().ToabsoluteUrl()); }
我的ToabsoluteUrl扩展方法
public static class RouteHelper{ private static UrlHelper _urlHelper; private static string _rootUrl; public static string ToabsoluteUrl(this ActionResult result) { EnsureUrlHelperInitialized(); var relativeUrl = _urlHelper.Action(result); return string.Format("{0}/{1}",_rootUrl,relativeUrl); } private static voID EnsureUrlHelperInitialized() { if (_urlHelper==null) { _rootUrl = ConfigurationManager.AppSettings["RootUrl"]; var request = new httpRequest("/",""); var response = new httpResponse(new StringWriter()); var context = new httpContext(request,response); httpContext.Current = context; var httpContextBase = new httpContextwrapper(context); Routetable.Routes.Clear(); MvcApplication.RegisterRoutes(Routetable.Routes); var requestContext = new RequestContext(httpContextBase,Routetable.Routes.GetRouteData(httpContextBase)); _urlHelper = new UrlHelper(requestContext,Routetable.Routes); } }}
初始化RequestContext和RouteCollection以便生成测试URL的正确方法是什么?
目前我在行var requestContext = new RequestContext(httpContextBase,Routetable.Routes.GetRouteData(httpContextBase));行上收到NullReferenceException.这是新建requestContext的正确方法吗?
或者如果有一个更好的方法来采取ActionResult(来自T4MVC)并将其解析为绝对网址,在网络应用之外,那就是我正在寻找的.
解决方法public static class RouteHelper{ private static UrlHelper _urlHelper; private static string _rootUrl; static RouteHelper() { var routes = new RouteCollection(); MvcApplication.RegisterRoutes(routes); var req = new httpRequest(string.Empty,"http://www.site.com",null); var res = new httpResponse(null); var ctx = new httpContext(req,res); // do not use httpContext.Current var requestContext = new RequestContext(new httpContextwrapper(ctx),new RouteData()); _urlHelper = new UrlHelper(requestContext,routes); _rootUrl = ConfigurationManager.AppSettings["RootUrl"]; } public static string ToabsoluteUrl(this ActionResult result) { return string.Format("{0}{1}",_urlHelper.Action(result)); }}
静态构造函数设置您的私有字段.我选择使用新的RouteCollection,而不是使用静态的Routetable.Routes属性,但您可以使用.
我不认为httpRequest和httpResponse的构造函数很重要.我只是传入一些字符串来让它们构造而不抛出异常.使用它们构建一个全新的httpContext(从xUnit运行时不要使用httpContext.Current).然后,您可以将其放入httpContextwrapper以获取httpContextBase引用.
构造一个新的RequestContext,传入基础包装器和一个新的RouteData实例.使用它和您之前的RouteCollection来构造UrlHelper.请注意,其Action方法将返回前缀为“/”的字符串,因此您应该将其保留在RootUrl appSetting之外(因此请使用类似值=“https://develop.site.com”的内容而不使用尾部斜杠).
请注意,这不适用于MVC区域中定义的路由.为此,除了在全局asax中调用RegisterRoutes之外,还需要注册这些区域.
总结以上是内存溢出为你收集整理的从非Web应用程序使用Asp.Net MVC路由(测试)全部内容,希望文章能够帮你解决从非Web应用程序使用Asp.Net MVC路由(测试)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)