2010-05-25 8 views
5

Sto cercando di usare il codice come il seguente nel mio test di unità,Come posso testare la rotta/la risoluzione dell'URL con la stringa di query?

/* 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); 

Il problema è che questo sta fallendo con "Risultati attesi dal era Risultati? Testo di ricerca = x"

C'è qualcuno hai una soluzione che mi permetta di testare che un URL (con stringa di query) risolve il controller, l'azione e gli argomenti corretti?

FYI, Non ho una configurazione di instradamento esplicita in Global.asax.cs, poiché la route predefinita funziona per l'app effettiva, semplicemente non funziona in questo test.

+0

Qualche suggerimento su altri testHelpers che rendono il test di percorso facile come questo? – Graza

risposta

9

IMHO ha senso di unit test solo percorsi personalizzati. Verificare che i parametri della stringa di query siano tradotti in argomenti di azione del controller non è necessario e in realtà non apporta alcun valore all'applicazione. Questo lavoro viene eseguito dal modello predefinito e viene ampiamente testato da Microsoft (spero).

Detto questo MVCContrib.TestHelper consente di testare elegantemente percorsi personalizzati. Supponiamo per esempio che si è implementato il paging nella propria applicazione e definito un percorso personalizzato per avere per gli URL SEO:

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

ed ecco il controller associato:

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

Questo percorso potrebbe essere testato come questo :

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

Questo effettivamente verifichi se il controller di default è Search, l'azione predefinita è Results e che entrambi 01 I parametrie endPage verranno inizializzati ai rispettivi valori dalla rotta.

+0

Questo funzionerebbe ed è ciò che stavo facendo, ma il problema è che volevo testare un URL con una stringa di query (ad es. "/ Controller/Azione? Query") e TestHelper non gestisce le stringhe di query. Avrei potuto cambiare la ricerca per utilizzare il percorso piuttosto che la query, ma ciò avrebbe coinvolto il lato client JS per creare un URL per la richiesta: in questo caso non volevo JS, solo una semplice sottomissione di modulo GET. Potresti avere ragione, tuttavia, che non vale la pena di provarlo. Il progetto a cui stavo lavorando quando ho chiesto è stata la mia prima incursione in MVC, e non sono ancora sicuro di quanto le parti "magiche" debbano essere testate. – Graza

+0

Cosa succede se la mia rotta personalizzata funziona solo con una stringa di query? (Oltre alla mia rotta, la firma dell'azione del mio controllore ha un parametro id che viene passato dalla stringa della query - ora come posso testare unitamente quel percorso personalizzato?) – BornToCode

Problemi correlati