2009-07-09 9 views
8

He estado utilizando ASP.NET MVC por un tiempo y ahora parece que constantemente estoy devolviendo cosas que no sean ActionResult de mi Controladores Obviamente, devuelvo ViewResults pero también JSonResults y también un par de resultados personalizados que hemos creado en casa.¿Es una buena práctica especificar explícitamente el tipo de ActionResult devuelto por un controlador en ASP.NET MVC

Me pregunto aunque, si, en lugar de declarar mis métodos de controlador como:

public ActionResult Index() 

debería empezar a declarar como

public ViewResult Index() 

o

public JsonResult Search() 

si Siempre sé que la acción de índice en mi controlador siempre será gire un ViewResult o la acción de Búsqueda en mi controlador siempre devolverá un JsonResult?

EDITAR: Solo para aclarar, estoy hablando específicamente de situaciones en las que siempre querré que se devuelva un tipo específico de ActionResult.

Respuesta

6

Voto sí por dos razones.

  1. Está declarando explícitamente lo que espera que devuelva el método y el compilador detendrá cualquier intento de hacerlo. No hay necesidad de una prueba unitaria que haga un Assert (el resultado es ViewResult).

  2. Debe arrojar el resultado al tipo esperado en sus pruebas al examinar cualquier propiedad exclusiva de ese tipo de resultado (por ejemplo, verificar la propiedad Url del RedirectResult). Simplemente declarando la variable de prueba como var se elimina cualquier fragilidad provocada por el cambio de tipos.

+0

Tendría que decir que esto tiene más sentido para mí. – lomaxx

1

Lo dejaría como el genérico ActionResult. Si lo convierte en el resultado específico y lo cambia más tarde, algunas de las pruebas de su unidad, si no todas, deberán reescribirse para adaptarse al cambio. Esto hará que las pruebas de tu unidad sean más frágiles de lo que deberían ser.

EDIT: adicionalmente, al dejarlo como un ActionResult, se permite la capacidad de devolver varios resultados diferentes según su lógica de acción. Por ejemplo, el flujo normal de su método puede devolver un resultado de redireccionamiento, pero puede tener rutas de error que devuelven un resultado de revisión o HttpUnauthorizedResult. Si escribe su método con más fuerza de la necesaria originalmente, puede terminar teniendo que refactorizarlo innecesariamente y sus pruebas a medida que agrega resultados alternativos más adelante.

La conclusión es que no veo ninguna ventaja real y, al menos un par, desventajas.

+2

¿Por qué tendrían que cambiar las pruebas de mi unidad? Si estoy probando un tipo de resultado específico, ¿no debería desear que las pruebas de mi unidad fallen si se devuelve algo que no sea ese resultado?Si estoy cambiando el tipo de devolución, ¿no querría también cambiar mis pruebas primero para atender esto? – lomaxx

+0

Cuando crea una prueba de unidad (al menos con MSTest), completará el tipo de resultado para el resultado real para usted. Si tuviera que dejar ese código solo, en las pruebas que no están realmente comprobando el tipo de resultado correcto, pero tal vez asegurándose de que haya ocurrido una inserción de DB, por ejemplo, esa prueba ahora dependerá del tipo de resultado cuando no necesita ser Eso es lo que quiero decir con frágil. Si, por otro lado, refactorizaste las pruebas para que declares el uso de var, esto no sería necesariamente un problema (a menudo hago esto de todos modos), pero debes recordar hacerlo. – tvanfosson

+0

No sé ustedes, pero mis páginas nunca están realmente completas hasta cerca del final. Siempre estoy agregando bits aquí y allá. Al vincularme a un tipo en particular, significaría más trabajo para mí. dejándolo como ActionResult me ​​da la flexibilidad de agregar otras clases a mi FormViewModel. – griegs

2

Al declarar un tipo de devolución más específico, está ganando un poco más de comprobación del tipo de compilador que ahora no tiene que cubrir en pruebas unitarias.

Sin embargo, usted se vincularía a ese tipo, y tendría que revertir si eso cambia. Un ejemplo común es si debe redireccionar al usuario a otra parte en algunas condiciones especiales devolviendo un resultado de redireccionamiento.

+0

Puede hacer el mismo argumento para cualquier método que devuelva cualquier tipo. Si deseo devolver varios tipos de resultados, entonces estoy de acuerdo, probablemente debería dejarlo como resultado de la acción, pero si el comportamiento deseado es devolver siempre un resultado de acción específico, ¿hay alguna razón por la cual no debería devolver ese resultado de acción específico? ¿tipo? – lomaxx

Cuestiones relacionadas