CompliationLock генерирует исключение HttpException при регистрации областей для модульных тестов ASP.NET MVC - PullRequest
0 голосов
/ 17 мая 2010

В тот момент, когда я добавил модульный тест в мое приложение ASP.NET MVC для проверки некоторых областей маршрутизации, я получил HttpException из инициализатора типа System.Web.Complication.CompilationLock со следующей трассировкой стека.

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()

1 Ответ

2 голосов
/ 17 мая 2010

Для всех, кто следовал учебникам MVC Области на MSDN , вы обнаружите проблему, если когда-нибудь добавите модульные тесты в созданное вами веб-приложение.

Он говорит вам добавить AreaRegistration.RegisterAllAreas() к методу RegisterRoutes. К сожалению, это статический метод, который расстраивается при вызове из модульных тестов.

Вместо этого зарегистрируйте области в пределах Application_Start, прямо перед вызовом RegisterRoutes, который вы только что изменили. Если вы сначала наберете RegisterRoutes, UrlParameter.Optional, по-видимому, перестанет работать на маршрутных маршрутах (хотя продолжает работать на маршрутах вне зоны).

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