2017-04-04 74 views
1

在我的ASP.NET Core項目中,我寫了ILoggerFactory的擴展,它增加了一個自定義的ILoggerProvider。 (類似NLog.Extensions.Logging在ASP.NET Core中處理ILoggerFactory

我在Startup.cs添加此:

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

測井工作完美,但是,它發送消息給RabbitMQ的,這意味着它打開一個連接和信道。這些不能繼續開放,所以我關閉Dispose通道和連接(ILoggerProvider已經從IDisposable繼承)

我的測試是成功的,但問題是,我的測試輸出始終顯示此錯誤

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方法。我發現在一個提供者中,你可以有多個記錄器(例如,你的每個asp.net控制器或控制檯應用程序中的每個服務都有一個)。我錯誤地認爲每個記錄器都有自己的提供者,我只處理了一個​​(最後一個)。

當我改變了我的ILoggerProvider代碼到這一點,我不再有掛起或錯誤,在我的單元測試

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

總之,如果你想寫一個自定義ILoggerFactory與​​類必須您必須將​​對象保存在您的ILoggerProvider的私人列表中,並在調用Dispose時將其全部棄置。如果你的​​不需要像NLog那樣處理,你不必擔心這一點。