在我的ASP.NET核心项目中,我在ILoggerFactory
上编写了一个添加自定义ILoggerProvider
的扩展。 (类似于NLog.Extensions.Logging)
我在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 :(得分:0)
我可以通过更改position: sticky;
bottom: 0;
扩展程序库来解决此问题。
我也遇到了使用此扩展的控制台应用程序的问题,但仅当我使用多个具有ILoggerFactory
实现的服务时。
在提供程序中(派生自ILogger
),有ILoggerProvider
方法。我发现在一个提供程序中你可以拥有多个记录器(例如,每个asp.net控制器一个或控制台应用程序中的每个服务)。我错误地认为每个记录器都有它自己的提供者,我只处理了一个CreateLogger
(最后一个)。
当我将ILogger
代码更改为此代码时,我的单元测试中不再出现挂起或错误
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
,您必须将ILogger
个对象保留在您的私有列表中ILogger
并在调用ILoggerProvider
时将它们全部丢弃。如果您的Dispose
不需要像NLog一样处理,则不必担心这一点。