gpt4 book ai didi

asp.net - 使用非 Web 应用程序中的 Asp.Net MVC 路由(测试)

转载 作者:行者123 更新时间:2023-12-04 19:15:16 25 4
gpt4 key购买 nike

我正在使用 Watin 为使用 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);
}

我更愿意像在 MVC 应用程序中那样使用我的 T4MVC 操作结果,就像这样......
[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("/", _rootUrl, "");
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)并将其解析为绝对 url,在 web 应用程序之外,这就是我正在寻找的。

最佳答案

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}", _rootUrl, _urlHelper.Action(result));
}
}

静态构造函数设置您的私有(private)字段。我选择使用新的 RouteCollection,而不是使用静态 RouteTable.Routes 属性,但您也许可以。

我不认为 HttpRequest 和 HttpResponse 的构造函数很重要。我只是传入了一些字符串来让它们在不抛出异常的情况下构造。使用它们来构造一个全新的 HttpContext(从 xUnit 运行时不要使用 HttpContext.Current)。然后,您可以将其放入 HttpContextWrapper 以获取您的 HttpContextBase 引用。

构造一个新的 RequestContext,传入你的基本包装器和一个新的 RouteData 实例。使用它与您之前的 RouteCollection 一起构建 UrlHelper。请注意,它的 Action 方法将返回以“/”开头的字符串,因此您应该将其排除在我们的 RootUrl appSetting 之外(因此请使用 value="https://develop.site.com"之类的内容,而不要使用尾部斜杠)。

请注意,这不适用于 MVC 区域中定义的路由。为此,除了在全局 asax 中调用 RegisterRoutes 之外,您还需要注册这些区域。

关于asp.net - 使用非 Web 应用程序中的 Asp.Net MVC 路由(测试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10499478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com