Estoy escribiendo pruebas de flujo de espectros usando Watin, para una aplicación Asp.Net MVC que usa T4MVC.Usando Asp.Net MVC Rutas de una aplicación no web (pruebas)
Me encuentro utilizando las URL de "cadena mágica" en las pruebas, que no me gustan.
[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);
}
que prefiero usar mis resultados de la acción T4MVC como lo hago en la App MVC, algo como esto ...
[Given(@"I am on the sign up page")]
public void GivenIAmOnTheSignUpPage()
{
WebBrowser.Current.GoTo(MVC.Authentication.SignUp().ToAbsoluteUrl());
}
mi método ToAbsoluteUrl
Extensión
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);
}
}
}
¿Cuál es la forma correcta de inicializar RequestContext y RouteCollection para que pueda generar mis URL de prueba?
Actualmente recibo una NullReferenceException en la línea var requestContext = new RequestContext(httpContextBase, RouteTable.Routes.GetRouteData(httpContextBase));
. ¿Es esa la manera correcta de actualizar un requestContext?
O si hay una forma mejor de tomar un ActionResult (de T4MVC) y resolverlo en una url absoluta, fuera de una aplicación web, eso es realmente lo que estoy buscando.
¿Qué unidad de prueba lib está utilizando con SpecFlow? ¿MsTest, NUnit o algo más? – danludwig
Estoy usando xUnit, ¿eso importa? – Brook
No, me preguntaba para poder personalizar mi respuesta. No estoy seguro de cuáles son los equivalentes de xunit para [TestClass] y [AssemblyInitialize], pero imagine que no es difícil de descubrir. – danludwig