2010-05-25 16 views
5

Estoy tratando de utilizar código como el siguiente en mis pruebas de unidad,¿Cómo puedo probar la resolución de ruta/acción de URL con cadena de consulta?

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

El problema es que esto está fallando con "resultados esperados por los resultados fue? SearchText = x"

¿Hay alguien ¿Tengo una solución que me permita probar que una URL (con una cadena de consulta) resuelve el controlador, la acción y los argumentos correctos?

FYI, no tengo una configuración de ruta explícita en Global.asax.cs, ya que la ruta predeterminada funciona para la aplicación real; simplemente no funciona en esta prueba.

+0

¿Alguna sugerencia acerca de otros TestHelpers que hacen que las pruebas de ruta sean tan sencillas como esta? – Graza

Respuesta

9

mi humilde opinión que tiene sentido para los exámenes de unidad únicas rutas personalizadas. Probar que los parámetros de cadena de consulta se traducirán en argumentos de acción de controlador es innecesario y realmente no aporta ningún valor a su aplicación. Este trabajo lo realiza el encuadernador de modelo predeterminado y Microsoft lo prueba exhaustivamente (espero).

Dicho esto MVCContrib.TestHelper le permite probar elegantemente las rutas personalizadas. Supongamos por ejemplo que ha implementado paginación en su aplicación y define una ruta personalizada para tener URLs amigables para SEO:

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

y aquí está el controlador asociado:

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

Esta ruta podría ponerse a prueba como esta :

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

Este procedimiento permite determinar de manera efectiva que el controlador por defecto es Search, la acción predeterminada es Results y que ambos 01 Los parámetrosy endPage se inicializarán a sus valores respectivos de la ruta.

+0

Esto funcionaría y es lo que estaba haciendo, pero el problema es que quería probar una URL con una cadena de consulta (es decir, "/ Controller/Action? Query"), y TestHelper no maneja las cadenas de consulta. Pude haber cambiado la búsqueda para usar la ruta en lugar de la consulta, pero eso hubiera implicado que JS del lado del cliente construyera una URL para la solicitud; en este caso, no quería JS, solo un formulario GET de envío simple. Sin embargo, puede estar en lo cierto, que no vale la pena probarlo. El proyecto en el que estaba trabajando cuando pregunté fue mi primera incursión en MVC, y todavía no estoy seguro de en qué medida las partes "mágicas" deberían probarse. – Graza

+0

¿Qué sucede si mi ruta personalizada solo funciona con una cadena de consulta? (Además de mi ruta, la firma de acción de mi controlador tiene un parámetro de id que pasa la cadena de consulta; ahora, ¿cómo puedo probar la unidad esa ruta personalizada?) – BornToCode

Cuestiones relacionadas