从非Web应用程序使用Asp.Net MVC路由(测试)

从非Web应用程序使用Asp.Net MVC路由(测试),第1张

概述我正在使用Watin编写specflow测试,用于使用T4MVC的Asp.Net MVC应用程序. 我发现自己在测试中使用了“魔术字符串”网址,这是我不喜欢的. [Given(@"I am on the sign up page")]public void GivenIAmOnTheSignUpPage(){ string rootUrl = ConfigurationManager. 我正在使用Watin编写specflow测试,用于使用T4MVC的Asp.Net MVC应用程序.

我发现自己在测试中使用了“魔术字符串”网址,这是我不喜欢的.

[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路由(测试)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存