2011-11-08 8 views
5

Si llegamos a SomeController.SomeAction() pero el archivo SomeAction.cshtml no se encuentra obtenemos un System.InvalidOperationException y el mensaje de error de salida ...¿Cómo comprobar que la llamada de una acción a View() no ha arrojado una excepción?

La vista 'algunaAccion' o su maestro no se encontró o no view engine admite las ubicaciones buscadas. Los siguientes lugares se realizaron búsquedas: ... etc

Sin embargo, incluso con este archivo que falta la prueba a continuación pasará como un ViewResult está siendo devuelto todavía.

¿Cuál es la mejor manera de comprobar la llamada de la acción a View() no ha iniciado una excepción y en silencio regresado esto en ViewResult contenido?


public class SomeController: Controller 
{ 
    public ActionResult SomeAction() 
    { 
     var viewModel = new SomeModel(); 
     return View(viewModel); 
    } 
} 

[Test] 
public void TestIndex(Type clientType) 
{ 
    var controller = new SomeController(); 
    var result = (ViewResult)controller.SomeAction(); 

    Assert.That(result, Is.TypeOf<ViewResult>()); 
} 

NOTA: Este es un ejemplo trivial de un problema mayor, hay una buena razón para realizar este tipo de prueba en este punto, pero este no es el foro para que discusión.

+0

¿Tal vez si eliminas el elenco para ViewResult? – Dave

+0

'Algún contexto adicional:' Algunas personalizaciones de motor de vista significan que el código anterior buscará el árbol de Vistas dinámicamente en función del código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. – gingerbreadboy

Respuesta

1

Por lo general, asegurarse de que el código de vista se ejecuta sin error es responsabilidad de las pruebas de UI, no de las pruebas unitarias. Sin embargo, puedes intentar utilizar el método FindView. Tendría que burlarse de un ControllerContext para imitar la solicitud Http que está pretendiendo realizar.

Puede que también le interese la última versión de Resharper, que es muy buena para avisarle cuando su código de controlador se refiere a una Vista que no existe.

+0

Algunas personalizaciones de motor de vista significan que el código anterior buscará el árbol de Vistas dinámicamente en función del código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. Resharper no puede ayudarnos aquí desafortunadamente, increíble como es :) – gingerbreadboy

+0

@runrunraygun: ¿Eso evitará que el método FindView funcione? – StriplingWarrior

+0

Voy a intentar burlarme de un ControllerContext y ver cómo va eso. Informará cuando haya terminado. – gingerbreadboy

3

En mi opinión, no debería tratar de afirmar si existe una vista en la prueba unitaria para una acción del controlador. Lo que necesita probar es el comportamiento de la acción del controlador, que en este caso es bastante simple, como debería ser. Por lo tanto, tendría pruebas para:

  • Acción devuelve la vista predeterminada;
  • La acción pasa el modelo correcto para la vista.

Además, como nota al margen, si usted tiene una prueba que arroja el resultado de la acción a ViewResult que también podría ser explícito acerca de ello y cambiar el tipo de retorno de la acción. Este cambio hace que su código sea más claro y también elimina la necesidad de la prueba de muestra que presentó que tiene un error, ya que si el lanzamiento falla, no se alcanza el código de aserción y si el lanzamiento tiene éxito, la afirmación es redundante.

+0

Aprecio que se tome su tiempo para proporcionar alguna información, pero hay buenas razones para realizar este tipo de prueba en este momento. Algunas personalizaciones de motor de vista significan que el código anterior buscará el árbol de Vistas dinámicamente en función del código que no se muestra y hay cientos de posibles permutaciones del árbol de búsqueda. – gingerbreadboy

+2

Luego necesita probar las personalizaciones del motor de vista por separado de las pruebas de la unidad controladora y probablemente también realizar pruebas de integración para asegurarse de que cualquier permutación posible generada tenga una vista correspondiente definida. –

+0

La arquitectura es la arquitectura, el requisito de la prueba proviene de lo alto. Yo solo trabajo aquí;) – gingerbreadboy

Cuestiones relacionadas