私はあなたと同じ問題を打つ - 私の場合それはNLogの静的メソッドとあった:
LogManager.GetCurrentClassLogger()
私は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;
ランニング私のコードの単体テストは、元の質問と同じ例外を投げた。
スタックトレース:あなたは動作しません作られて設定ファイルを読み込むしようとし、スタックトレースから見ることができるように
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...
- なぜ?現在の嘲笑された現在のプリンシパルは、もともとは私たちが持っていたWindowsPrincipalではなくなったため、Windowsのファイルアクセスを一切持たない偽のプリンシパルになりました。
ここでは、この問題を解決するための方法がいくつかあります。
- ロガーをスタブにするために、私のクラスにロガーを注入してください(とにかく私はこれをやっているはずです)。これにより、スレッドのプリンシパルにスタブを使用することができます。
- スレッドで、既存のWindowsPrincipalを変更(またはそれに基づいて別のスレッドを作成)して、自分のメソッドを呼び出すために必要なロールを追加します。
- UPDATE -
私の問題を解決するには、最後に私は上記の私の最初の提案で実行することを決めました。私自身のNLog Loggerの抽象化を避けるために、私はCommon.Loggingから提供されたものを活用しました。クラスのコンストラクタは現在ロガーがちょうどこのように見える注入するそれらのパラメータの一つとしてのILog、ユニティ設定を受け入れる:
container.RegisterType<ILog>(new TransientLifetimeManager(), new InjectionFactory(x => LogManager.GetCurrentClassLogger()));
はまた、私のユニットテストは、今私が嘲笑ロガーに渡すことができます。
var logger = MockRepository.GenerateStub<ILog>();
あなたはコードの一部を持っていますか? –