2010-05-25 4 views
5

Ich versuche, Code wie die folgend in meinen Unit-Tests zu verwenden,Wie kann ich die Routen-/Aktionsauflösung der URL mit der Abfragezeichenfolge testen?

/* Test setup code */ 
_routes = RouteTable.Routes; 
MvcApplication.RegisterRoutes(_routes); //set up the routes as they would be in actual application 
/* test code */ 
Expression<Func<SearchController, ActionResult>> actionFunc; 
actionFunc = action => action.Results("x", 3, null); 
RouteTestingExtensions.Route(
    "~/Search/Results?searchText=x" 
).ShouldMapTo<SearchController>(actionFunc); 

Das Problem ist, diese mit versagt „durch waren Ergebnisse Streben Ergebnisse? Search = x“

niemand habe eine Lösung, mit der ich testen kann, ob eine URL (mit Abfragezeichenfolge) in die richtige Steuerung, Aktion und Argumente aufgelöst wird?

FYI, ich habe keine explizite Route Setup in Global.asax.cs, da die Standardroute für die eigentliche App funktioniert - es funktioniert einfach nicht in diesem Test.

+0

Haben Sie Vorschläge zu anderen TestHelpern, die Routentests so einfach machen? – Graza

Antwort

9

IMHO macht es Sinn, Unit-Test nur individuelle Routen. Das Testen dieser Abfrage-String-Parameter in Controller-Action-Argumente ist unnötig und bringt Ihrer Anwendung keinen wirklichen Wert. Diese Arbeit wird vom Standard-Modellbinder erledigt und wird von Microsoft (hoffentlich) umfassend getestet.

Dies besagt MVCContrib.TestHelper ermöglicht es Ihnen, benutzerdefinierte Routen elegant zu testen. Nehmen wir zum Beispiel, dass Sie das Paging in Ihrer Anwendung implementiert haben und definiert eine benutzerdefinierte Route ziemlich Urls für SEO haben:

routes.MapRoute(
    "Custom", 
    "foo/{startPage}/{endPage}", 
    new 
    { 
     controller = "Search", 
     action = "Results", 
    } 
); 

und hier ist der zugehörige Controller:

public class SearchController : Controller 
{ 
    public ActionResult Results(int startPage, int endPage) 
    { 
     return View(); 
    } 
} 

Diese Route wie folgt getestet werden konnten :

"~/foo/10/20".ShouldMapTo<SearchController>(c => c.Results(10, 20)); 

Dieser Test wird wirksam, dass die Standard-Controller Search, die Standard-Aktion ist Results und dass beide startPage und endPage Parameter werden auf ihre jeweiligen Werte von der Route initialisiert.

+0

Dies würde funktionieren & ist, was ich tat, aber das Problem ist, dass ich eine URL mit einer Abfragezeichenfolge (d. H. "/ Controller/Action? Query") testen wollte, und der TestHelper nicht Abfragezeichenfolgen behandelt. Ich könnte die Suche geändert haben, um Pfad statt Abfrage zu verwenden, aber das hätte clientseitige JS mit einbezogen, um eine URL für die Anfrage zu erstellen - in diesem Fall wollte ich kein JS, nur eine einfache Formularübergabe GET. Sie können jedoch Recht haben, dass es sich nicht lohnt, zu testen. Das Projekt, an dem ich arbeitete, als ich es fragte, war mein erster Ausflug in MVC, und ich bin mir immer noch nicht sicher, in welchem ​​Ausmaß die "magischen" Teile getestet werden sollten. – Graza

+0

Was passiert, wenn meine benutzerdefinierte Route nur mit einer Abfragezeichenfolge funktioniert? (Neben meiner Route hat die Aktionssignatur meines Controllers einen ID-Parameter, der von der Abfragezeichenfolge übergeben wird. Wie kann ich diese benutzerdefinierte Route testen?) – BornToCode

Verwandte Themen