route - web forms c# tutorial
¿Cómo pruebo la lógica de registro de área en MVC 3? (1)
Tengo una clase HttpApplication simple:
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
// register areas
AreaRegistration.RegisterAllAreas();
// register other stuff...
}
}
Mi unidad prueba inicializar HttpApplication
, invocar ApplicationStart
y verificar el comportamiento de inicio de la aplicación.
Este enfoque funcionó bien hasta que tuve que integrar áreas de MVC. Cuando AreaRegistration.RegisterAllAreas()
es invocado por una prueba unitaria, se lanza la siguiente excepción:
System.InvalidOperationException: This method cannot be called during the application''s pre-start initialization stage.
¿Hay un buen enfoque para probar la lógica de inicialización del área?
Solución temporal:
1) En MvcApplication, exponga el método virtual RegisterAllAreas()
public class MvcApplication : HttpApplication
{
public void Application_Start()
{
// register areas
RegisterAllAreas();
// register other stuff...
}
public virtual void RegisterAllAreas()
{
AreaRegistration.RegisterAllAreas();
}
}
2) En la especificación, implementar un proxy:
[Subject(typeof(MvcApplication))]
public class when_application_starts : mvc_application_spec
{
protected static MvcApplication application;
protected static bool areas_registered;
Establish context = () => application = new MvcApplicationProxy();
Because of = () => application.Application_Start();
It should_register_mvc_areas = () => areas_registered.ShouldBeTrue();
class MvcApplicationProxy : MvcApplication
{
protected override void RegisterAllAreas()
{
areas_registered = true;
}
}
}
3) Probar implementaciones de AreaRegistration
individualmente
4) Excluir MvcApplication.RegisterAllAreas()
de la cobertura de prueba
No me gusta este enfoque, pero no puedo pensar en una mejor solución en este momento.
Ideas y comentarios son bienvenidos ...