2014-11-26 8 views
2

Я получаю исключение, когда запускаю единичный тест на контроллере в веб-проекте (ASP.NET web api). Исключение, когда LogManager.GetCurrentClassLogger() контроллера выполняется:MethodAccessException при вызове nlog LogManager.GetCurrentClassLogger()

System.MethodAccessException: Попытка методом «Castle.Proxies.ClaimsPrincipalProxy.GetObjectData (System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization. StreamingContext) 'для доступа к методу' Castle.DynamicProxy.Internal.TypeUtil.Sort (System.Reflection.MemberInfo []) 'failed

Это приводит к исключению TypeInitializationException в LogManager.GetCurrentClassLogger(). здесь стек вызовов:

на Castle.Proxies.ClaimsPrincipalProxy.GetObjectData (SerializationInfo, StreamingContext) в System.Runtime.Serialization.ObjectCloneHelper.GetObjectData (Object serObj Строковый & TYPENAME, String & assemName, String [] & имен полей, Object [] & FieldValues) на System.AppDomain.get_Evidence() в System.AppDomain.get_Evidence() в System.Configuration.ClientConfigPaths.GetEvidenceInfo (AppDomain AppDomain, струнный ExePath, иая Строка TypeName) в системе .Configuration.ClientConfigPaths.GetTypeAndHashSuffix (AppDomain appDomain, String exePat ч) на System.Configuration.ClientConfigPaths..ctor (String ExePath, Boolean includeUserConfig) на System.Configuration.ClientConfigPaths.GetPaths (String ExePath, Boolean includeUserConfig) в System.Configuration.ClientConfigurationHost.RequireCompleteInit (IInternalConfigRecord запись) в System.Configuration.BaseConfigurationRecord.GetSectionRecursive (String configKey, булева getLkg, булева checkPermission, булева getRuntimeObject, булева requestIsHere, исй результат объекта, ссылка resultRuntimeObject объекта) на System.Configuration.BaseConfigurationRecord.GetSection (Строка configKey) на System.Configuration. ConfigurationManager.GetSection (String sectionName) в NLog.Config.XmlLoggingConfiguration.get_AppConfig() в NLog.LogFactory.get_ Конфигурация() в NLog.LogFactory.GetLogger (LoggerCacheKey cacheKey) в NLog.LogFactory.GetLogger (имя String) на NLog.LogManager.GetCurrentClassLogger()

Update: Проблема происходит, когда модульного тестирования ссылки на проекты NSubstitute. Таким образом, кажется, что существует некоторая опасная комбинация веб-API, NSubstitute и NLog.

Обновление 2: Обнаружено, что расстраивает Nlog в контроллере. Перед вызовом метода контроллера я набор издевался принципал для Thread.CurrentPrincipal:

var principal = Substitute.For<ClaimsPrincipal>(); 
principal.Identity.Returns(...); 
Thread.CurrentPrincipal = principal; 

Как можно это исправить?

+0

Вы нашли решение? У меня такое же исключение в моем проекте. В методе клонирования, реализованном во внешней сборке ... – Antiohia

ответ

0

Замок может быть отмечен атрибутом AllowPartiallyTrustedCallersAttribute и использует модель прозрачности безопасности уровня 2.

Прозрачность уровня 2 приводит к тому, что все методы в AllowPartiallyTrustedCallers становятся прозрачными по умолчанию, что может быть причиной этого исключения.

Вы можете попробовать аннотирования ваш модульного тестирования (и класса) со следующим атрибутом - [SecuritySafeCritical]

+1

[SecuritySafeCritical] не работает –