2009-07-09 10 views
8

Sto usando ASP.NET MVC da un po 'di tempo e sembra trovarmi costantemente a restituire cose diverse da ActionResult dal mio controllori. Ovviamente restituisco ViewResults ma anche JSonResults e anche un paio di risultati personalizzati che abbiamo costruito in casa.È consigliabile specificare esplicitamente il tipo di ActionResult restituito da un controller in ASP.NET MVC

Mi chiedo tho, se, invece di dichiarare i miei metodi di controller come:

public ActionResult Index() 

dovrei iniziare dichiarandoli come

public ViewResult Index() 

o

public JsonResult Search() 

se So sempre che l'azione Index sul mio controller sarà sempre re girare un ViewResult o l'azione di ricerca sul mio controller restituirà sempre un JsonResult?

EDIT: Giusto per chiarire, sto parlando specificamente di situazioni in cui voglio sempre un tipo specifico di ActionResult da restituire.

risposta

6

Io voto si per due motivi.

  1. Si dichiara esplicitamente che cosa si aspetta che il metodo restituisca e il compilatore prenderà qualsiasi tentativo di fare altrimenti. Non c'è bisogno di un test unitario che faccia un Assert (il risultato è ViewResult).

  2. È necessario trasmettere il risultato al tipo previsto nei test quando si esaminano le proprietà univoche del tipo di risultato (ad esempio, controllo della proprietà Url di RedirectResult). Semplicemente dichiarando la variabile di prova come var si rimuove qualsiasi infrazione dovuta alla modifica dei tipi.

+0

Dovrei dire che questo ha più senso per me. – lomaxx

1

Vorrei lasciarlo come ActionResult generico. Se rendi il risultato specifico e lo cambi in seguito, alcuni, se non tutti, i test delle tue unità dovranno essere riscritti per adattarsi alla modifica. Ciò renderà le tue unità test più fragili di quanto debbano essere.

EDIT: inoltre, lasciandolo come ActionResult, ti concedi la possibilità di restituire risultati diversi in base alla tua logica di azione. Ad esempio, il normale flusso del tuo metodo potrebbe restituire un RedirectResult, ma potresti avere percorsi di errore che restituiscono un ViewResult o HttpUnauthorizedResult. Se si digita il metodo più fortemente del necessario in origine, si può finire per dover refactoring inutilmente e i test come si aggiungono risultati alternativi in ​​seguito.

La linea di fondo è che non vedo alcun vantaggio reale e, almeno una coppia, svantaggi.

+2

Perché i test dell'unità devono essere modificati? Se sto provando per un tipo di risultato specifico, non dovrei volere che i miei test dell'unità falliscano se viene restituito qualcosa di diverso da quel risultato?Se sto cambiando il tipo di ritorno, non vorrei anche cambiare i miei test prima di provvedere a questo? – lomaxx

+0

Quando si crea un test unitario (almeno con MSTest), verrà compilato il tipo di risultato per il risultato effettivo. Se dovessi lasciare quel codice da solo, nei test che in realtà non controllano il tipo di risultato corretto - ma forse assicurandoti che si sia verificato un inserto DB, ad esempio - quel test sarebbe ora dipendente dal tipo di risultato quando non ha bisogno di essere. Questo è ciò che intendo per fragile. Se, d'altra parte, hai rifattorizzato i test in modo che dichiari di usare var, questo non sarebbe necessariamente un problema (lo faccio spesso comunque) - ma devi ricordarti di farlo. – tvanfosson

+0

Non so voi ma le mie pagine non sono mai veramente complete fino alla fine. Aggiungo sempre bit qua e là. Legare me stesso a un tipo particolare significherebbe più lavoro per me. lasciandolo come ActionResult mi consente la flessibilità di aggiungere altre classi al mio FormViewModel. – griegs

2

Dichiarando un tipo di restituzione più specifico si ottiene un po 'più di controllo del tipo di compilatore che ora non è necessario coprire nei test di unità.

Si vincolerebbe te stesso, tuttavia, a quel tipo e dovresti tornare se questo cambia. Un esempio comune è se devi reindirizzare l'utente altrove in alcune condizioni speciali restituendo un RedirectResult.

+0

È possibile creare lo stesso argomento per qualsiasi metodo che restituisce qualsiasi tipo. Se voglio restituire più tipi di risultati, quindi sono d'accordo, dovrei probabilmente lasciarlo come risultato dell'azione, ma se il comportamento desiderato è quello di restituire sempre un risultato di azione specifico, c'è qualche ragione per cui non dovrei restituire quel risultato di azione specifico genere? – lomaxx

Problemi correlati