Piszę testy specflow za pomocą Watin, dla aplikacji ASP.Net MVC, która używa T4MVC.Używanie tras Asp.Net MVC z aplikacji innych niż web (testy)
Używam adresów URL "magicznych ciągów" w testach, które mi się nie podobają.
[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);
}
Chciałbym dużo raczej wykorzystywać moje wyniki T4MVC akcji jak to zrobić w MVC aplikacji, coś takiego ...
[Given(@"I am on the sign up page")]
public void GivenIAmOnTheSignUpPage()
{
WebBrowser.Current.GoTo(MVC.Authentication.SignUp().ToAbsoluteUrl());
}
Moja ToAbsoluteUrl
Extension Metoda
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);
}
}
}
Co jest poprawny sposób inicjowania RequestContext i RouteCollection, aby móc generować moje testowe adresy URL?
Obecnie otrzymuję wyjątek NullReferenceException na linii var requestContext = new RequestContext(httpContextBase, RouteTable.Routes.GetRouteData(httpContextBase));
. Czy jest to właściwy sposób na dodanie requestContext?
A jeśli jest lepszy sposób na zrobienie ActionResulta (z T4MVC) i naprawienie go pod bezwzględnym adresem URL, poza aplikacją internetową, to jest to, czego naprawdę szukam.
Jaką wersję testową urządzenia używasz w specyfikacji SpecFlow? MsTest, NUnit, czy coś innego? – danludwig
Używam xUnit, czy to ważne? – Brook
Nie, zastanawiałem się, że mogę dostosować moją odpowiedź. Nie jestem pewien, jakie są równoważniki xunit dla [TestClass] i [AssemblyInitialize], ale wyobraź sobie, że nie jest trudno to stwierdzić. – danludwig