2010-05-17 7 views
0

Au moment où j'ai ajouté un test unitaire à mon application ASP.NET MVC pour tester certains routages de zone, j'ai obtenu un HttpException sortant de l'initialiseur de type System.Web.Complication.CompilationLock avec la trace de pile suivante.CompliationLock lance HttpException lors de l'enregistrement de zones pour les tests unitaires ASP.NET MVC

System.Web.HttpException : The type initializer for 'System.Web.Compilation.CompilationLock' threw an exception. 
    ----> System.TypeInitializationException : The type initializer for 'System.Web.Compilation.CompilationLock' threw an exception. 
    ----> System.NullReferenceException : Object reference not set to an instance of an object. 
at System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() 
at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() 
at System.Web.Compilation.BuildManager.GetReferencedAssemblies() 
at System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.GetReferencedAssemblies() 
at System.Web.Mvc.TypeCacheUtil.FilterTypesInAssemblies(IBuildManager buildManager, Predicate`1 predicate) 
at System.Web.Mvc.TypeCacheUtil.GetFilteredTypesFromAssemblies(String cacheName, Predicate`1 predicate, IBuildManager buildManager) 
at System.Web.Mvc.AreaRegistration.RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, Object state) 
at System.Web.Mvc.AreaRegistration.RegisterAllAreas(Object state) 
at System.Web.Mvc.AreaRegistration.RegisterAllAreas() 
at StpWeb.MvcApplication.RegisterRoutes(RouteCollection routes) in Global.asax.cs: line 16 
at StpWeb.Tests.RoutesTest.TestFixtureSetUp() in RoutesTest.cs: line 11 
--TypeInitializationException 
at System.Web.Compilation.CompilationLock.GetLock(ref Boolean gotLock) 
at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() 
--NullReferenceException 
at System.Web.Compilation.CompilationLock..cctor() 

Répondre

2

Pour quelqu'un d'autre qui a suivi le MVC Areas tutorials on MSDN, vous trouverez un problème si vous ajoutez jamais des tests unitaires à l'application Web que vous avez créé. Il vous dit d'ajouter AreaRegistration.RegisterAllAreas() à la méthode RegisterRoutes. Malheureusement, c'est une méthode statique qui s'énerve lorsqu'on l'appelle à partir de tests unitaires.

Au lieu de cela, inscrivez-vous dans les zones Application_Start, juste avant l'appel que vous venez de modifier RegisterRoutes. Si vous appelez d'abord RegisterRoutes, UrlParameter.Optional semble cesser de travailler dans les routes de zone (continue à travailler dans les routes non-zone, cependant).

protected void Application_Start() { 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 
} 
+0

je aurais pu sauver quelques heures si je trouvais [cette personne] (http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=4915) avec le même problème sur le site MVC CodePlex . Les commentaires sur ce problème offrent la même solution. – patridge

+0

Cela semble être configuré par défaut dans Global.asax.cs dans VS2010 lorsque vous créez un projet MVC2 vide. – patridge