gpt4 book ai didi

c# - 如何将 TestServer 输出记录到测试控制台

转载 作者:行者123 更新时间:2023-12-03 17:22:59 28 4
gpt4 key购买 nike

我目前正在为我的 ASP .Net Core 5 REST API 编写集成测试 (https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0)。
API 使用 Serilog 进行日志记录(使用静态 Serilog Logger)。我正在使用 NUnit、Visual Studio 2019、Resharper 运行测试。
我希望在 API 代码运行时记录的所有消息都在测试控制台输出中可见。
例如,如果调用此 Controller 方法:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Serilog;

namespace My.Crazy.Api.Controllers
{
public sealed class WheelsController : Controller
{
[HttpGet("getwheels")]
public async Task<IActionResult> Get()
{
Log.Error("An extremely urgent error");
return Ok();
}
}
}
我希望在测试控制台中显示“极其紧急的错误”消息。
然而,这并没有发生。
这是我的 TestServer 设置:
[OneTimeSetUp]
public async Task Setup()
{
var hostBuilder = new HostBuilder()
.ConfigureWebHost(webHost =>
{
webHost.UseTestServer();
webHost.UseStartup<Startup>(); // Startup is the API project's Startup class

Log.Logger = new LoggerConfiguration().WriteTo.Console().CreateLogger();
});

var host = await hostBuilder.StartAsync();

_client = host.GetTestClient();
}

[Test]
public async Task FirstTest()
{
var response = await _client.GetAsync("getwheels");
}
我还尝试使用自定义接收器进行日志记录:
...
// in the test setup
Log.Logger = new LoggerConfiguration().WriteTo.Sink(new CustomSink()).CreateLogger();
...

public class CustomSink : ILogEventSink
{
public void Emit(LogEvent logEvent)
{
var message = logEvent.RenderMessage();
Console.WriteLine(message);
}
}
这也行不通。但是,我已经确认在 API 代码记录任何消息时正在调用 Emit 方法。
最后,我尝试使用文件输出:
Log.Logger = new LoggerConfiguration().WriteTo.File("C:\\temp\\test_output.txt").CreateLogger();
这按预期工作。但是,我仍然想登录控制台。
这可能吗?
不幸的是,对于 Serilog 或 NUnit 使用其他任何东西都不是一种选择。

最佳答案

所以我会尝试使用带有记录器的自定义记录器提供程序:
记录器提供者:

public class NUnitLoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new NUnitLogger();
}

public void Dispose()
{
}
}
记录器:
public class NUnitLogger : ILogger, IDisposable
{
public void Dispose()
{
}

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception,
Func<TState, Exception, string> formatter) {
var message = formatter(state, exception);
Debug.WriteLine(message);
}

public bool IsEnabled(LogLevel logLevel) => true;

public IDisposable BeginScope<TState>(TState state) => this;
}
然后在测试文件中:
var hostBuilder = new HostBuilder()
.ConfigureWebHost(webHost =>
{
webHost.UseTestServer()
.UseStartup<TestStartup>()
.ConfigureLogging((hostBuilderContext, logging) =>
{
logging.Services.AddSingleton<ILoggerProvider, NUnitLoggerProvider>();
});
});
而不是 Debug.WriteLine(message) 你可以使用其他东西来登录。

关于c# - 如何将 TestServer 输出记录到测试控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65390376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com