Я пишу тесты спецификаций с помощью Watin для приложения Asp.Net MVC, которое использует T4MVC.
Я обнаружил, что использую в тестах URL-адреса «волшебной строки», что мне не нравится.
[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("/", _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-адреса?
В настоящее время я получаю исключение NullReferenceException в строке var requestContext = new RequestContext(httpContextBase, RouteTable.Routes.GetRouteData(httpContextBase));
. Это правильный способ создать новый requestContext?
Или, если есть лучший способ получить ActionResult (от T4MVC )и преобразовать его в абсолютный URL-адрес вне веб-приложения, это действительно то, что я ищу.