2017-04-04 8 views
1

私は、カスタムILoggerProviderを追加ILoggerFactoryに拡張子を書かれています。 (NLog.Extensions.Loggingと同様に)は私のASP.NETコアプロジェクトで

私はStartup.csでこれを追加している:

loggerFactory.AddRabbitLogger(Configuration.GetSection(nameof(WebLoggerOptions))); 

ロギングが完璧に働いている、しかし、それはRabbitMQのにメッセージを送信し、それはそれは、接続してチャンネルを開くことを意味します。これらは、私のテスト

ILoggerProviderはすでにIDisposableから継承)私はDispose内のチャネルとの接続を閉じるように開いたままにすることはできません成功しているが、問題は私のテスト出力は常に別の問題がある

Error while unloading appdomain. (Exception from HRESULT: 0x80131015) 

このエラーが表示されていることですテストが完了してから数秒かかるとエラーが表示されるので、新しいテストを開始できません。

私のテストでロガープロバイダの処分をトリガーする方法はありますか?ここで

は私の統合テストのコードです。あなたが見ることができるように、私はTearDown

統合テスト

public abstract class TestBase 
{ 
    private TestServer _server; 
    protected HttpClient TestHttpClient { get; private set; } 

    [SetUp] 
    protected void BaseSetup() 
    { 
     _server = new TestServer(new WebHostBuilder() 
      .UseStartup<Startup>()); 
     TestHttpClient = _server.CreateClient(); 
    }  

    [TearDown] 
    public void TearDown() 
    { 
     TestHttpClient.Dispose(); 
     _server.Dispose(); 
    } 
} 

public class MyTestClass : TestBase 
{ 
    [Test] 
    public async Task SendTest() 
    { 
     requestUrl = "api/ControllerName/Mehthod"; 
     var response = await TestHttpClient.PostAsync(requestUrl, pardotFormCommand, GetMediaTypeFormatter()); 
     response.StatusCode.Should().Be(HttpStatusCode.OK);    
    }   
} 
+0

あなたはコードを提供していませんが、私が推測するように、あなたは手作業でLoggerFactoryを手動で破棄することはできませんか? –

+0

組み込みのDIコンテナなどを使用していますか? – Dealdiane

+0

また、ロガークラスのスニペットを投稿してテストできますか? – Dealdiane

答えて

0

に処分をしています私は私のILoggerFactory拡張ライブラリを変更することでこの問題を解決することができました。 私はまた、この拡張を使用して、コンソールアプリケーションで問題があったが、私は​​実装で複数のサービスを使用する場合にのみ。

プロバイダー(ILoggerProviderから派生)にはCreateLoggerメソッドがあります。私は、1つのプロバイダー内で、複数のロガー(たとえば、各asp.netコントローラーまたはコンソールアプリケーションの各サービスごとに1つ)を持つことができることを発見しました。私は誤って、各ロガーは、それが自分のプロバイダだと思っていたと私は一つだけ​​(最後の1)に配置しました。

私はこれに私のILoggerProviderコードを変更した場合、あなたがする必要があります​​クラスにカスタムILoggerFactoryを書きたいならば、私はもはや、私のユニットテスト要するに

public ILogger CreateLogger(string categoryName) 
{ 
    var companyLogger = new CompanyLogger(categoryName, _loggerOptions); 
    _companyLoggers.Add(companyLogger); 

    return companyLogger; 
} 

public void Dispose() 
{ 
    foreach (var logger in _companyLoggers) 
    { 
     logger.Dispose(); 
    }   
} 

にハングまたはエラーが発生したがあなたがのプライベートリストに​​オブジェクトを保管しておき、Disposeが呼び出されたときにそれらをすべて処分する必要があります。​​をNLogのように処理する必要がない場合は、これについて心配する必要はありません。

関連する問題