je frappe la même question que vous - dans mon cas, il était avec la méthode statique NLog:
LogManager.GetCurrentClassLogger()
j'avais remplacé le principal thread courant avec un talon RhinoMocks:
var identity = MockRepository.GenerateStub<IIdentity>();
identity.Stub(x => x.IsAuthenticated).Return(true);
var principal = MockRepository.GenerateStub<IPrincipal>();
principal.Stub(x => x.Identity).Return(identity);
Thread.CurrentPrincipal = principal;
Course à pied tests unitaires pour mon code a jeté la même exception de la question initiale.
La trace de la pile:
at System.AppDomain.get_Evidence()
at System.AppDomain.get_EvidenceNoDemand()
at System.AppDomain.get_Evidence()
at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at NLog.Config.XmlLoggingConfiguration.get_AppConfig()
at NLog.LogFactory.get_Configuration()
at NLog.LogFactory.GetLogger(LoggerCacheKey cacheKey)
at NLog.LogFactory.GetLogger(String name)
at NLog.LogManager.GetCurrentClassLogger()
at MyClassHere...
Comme vous pouvez le voir à partir de la pile trace une tentative de lire le fichier de configuration est fait, ce qui ne fonctionne pas - pourquoi? Parce que le principal courant actuellement mocké n'est plus le WindowsPrincipal que nous avions à l'origine - c'est maintenant un principal mocked qui n'aura aucune sorte d'accès de fichier de Windows.
Penser à la manchette Voici quelques façons de résoudre ce problème.
- Injecter l'enregistreur dans ma classe pour qu'il puisse être écrasa (je devrais probablement faire cela de toute façon je suppose ..). Cela me permettrait d'utiliser un talon pour le chef de file.
- Modifiez le WindowsPrincipal existant (ou créez-en un autre sur la base de ce thread) pour ajouter les rôles requis pour appeler mes méthodes.
- MISE À JOUR -
Pour résoudre mon problème, à la fin j'ai décidé de courir avec ma première suggestion ci-dessus. Pour éviter d'écrire ma propre abstraction du NLog Logger, j'ai simplement exploité ce qui était offert par Common.Logging. Les constructeurs de classe acceptent maintenant ILog comme l'un de leurs paramètres, et la configuration Unity pour injecter l'enregistreur ressemble à ceci:
container.RegisterType<ILog>(new TransientLifetimeManager(), new InjectionFactory(x => LogManager.GetCurrentClassLogger()));
Pendant ce temps, mes tests unitaires me permettent maintenant de passer dans un enregistreur moqué.
var logger = MockRepository.GenerateStub<ILog>();
Avez-vous une partie du code? –