2012-05-07 21 views
6

Quiero confirmar que mi clase "HomeController" está siendo seleccionada por la ruta que he creado. Así que tengo una prueba como esta:Unit Test MVC con ASP.NET Dev Server

[TestMethod] 
    [UrlToTest("http://localhost:14478/home")] 
    [HostType("ASP.NET")] 
    [AspNetDevelopmentServerHost("$(SolutionDir)\\MvcBuildApp")] 
    public void MyTest() 
    { 
     System.Diagnostics.Debugger.Break(); 

     RouteCollection routes = new RouteCollection(); 
     MvcApplication.RegisterRoutes(routes); 
     MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters); 
     //This fetches DefaultControllerFactory (for now, anyway...) 
     var factory = ControllerBuilder.Current.GetControllerFactory(); 
     //mock a context... 
     var httpContext = CreateHttpContext("http://localhost:14478/home", "GET"); 
     RouteData route = routes.GetRouteData(httpContext); 

     var ctrlInstance = factory.CreateController(new RequestContext(httpContext, route), (string)route.Values["controller"]); 

     //ASSERT the instance is of type "HomeController" 
     //... 
    } 

Se produce un error, diciendo que 'http://localhost:14478/home' completed successfully without running the test.

me di cuenta de que en la ventana de salida VS, también existe este mensaje No connection could be made because the target machine actively refused it 127.0.0.1:14478. Pensé que Cassini no debería estar activa. Así que elegí lanzar el sitio que estaba siendo probado (ctrl + F5) antes de lanzar la prueba unitaria. Luego cambió la salida de VS a esto:

WebTestAdapter.ConnectToHostAdapter: se produjo una excepción inesperada. Microsoft.VisualStudio.TestTools.HostAdapters.AbortTestExecutionException: Error en la aplicación. en Microsoft.VisualStudio.TestTools.HostAdapters.WebTestAdapter.ConnectToHostAdapter()

Para tratar de resolver esto, he seguido los consejos de estos artículos:

... pero sigo recibiendo el error sin importar lo que haga. Sugerencias?

ACTUALIZACIÓN/CLARIFICACION
Esta pregunta es no acerca de las pruebas rutas MVC. El propósito de esta pregunta es descubrir cómo hacer que ASP.NET MVC se inicialice correctamente para permitir más pruebas automatizadas "en profundidad". He elegido un escenario de "prueba de ruta", frente a DefaultControllerFactory, simplemente como un ejemplo. En este ejemplo, DefaultControllerFactory no se comporta correctamente a menos que ASP.NET MVC se inicialice correctamente.

Respuesta

0

Usted puede estar interesado en la revisión de marco de pruebas de Steve Sanderson MVC.Si descarga la fuente que va a tener un gran ejemplo de cómo inicializar el framwork MVC:

http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/

+0

El enfoque de Steven, expresado en el enlace que proporcionó, es absolutamente brillante. No podía esperar nada mejor. No responde mi pregunta de cómo puedo usar las anotaciones AspNetDevelopmentServerHost y HostType, pero hace algo equivalente o mejor, en lo que a mí respecta. –

1

Este es un requisito común al probar aplicaciones MVC, y suerte, hay un marco que va a simplificar su vida al probar los controladores MVC:

las herramientas es:

http://mvccontrib.codeplex.com/

Y como ejemplo se puede crear pruebas con una sola línea:

"~/".ShouldMapTo<HomeController>(controller => controller.Index()); 

como referencia:

http://geekswithblogs.net/thomasweller/archive/2009/11/02/unit-testing-asp.net-mvc-routes.aspx

http://www.arrangeactassert.com/how-to-unit-test-asp-net-mvc-controllers/

+0

He actualizado mi pregunta para aclarar que no estoy realmente preguntando acerca de las pruebas de ruta. Notarás que mi prueba de ejemplo usa DefaultControllerFactory y tiene un comentario sobre cómo reemplazar esa fábrica. Una vez que se reemplaza la fábrica, el MVCContrib TestHelper al que hizo referencia ya no me beneficiará. –