netcore: создайте консольный логгер с помощью LoggerBuilder из тестового контроллера - PullRequest
0 голосов
/ 24 января 2019

У меня есть тестовый проект, в котором я настраиваю http-клиента следующим образом:

public class TestContext : IDisposable
{
    private TestServer _server;
    public HttpClient Client { get; private set; }

    public TestContext() {
        SetUpClient();
    }

    private void SetUpClient()
    {
        _server = new TestServer(new WebHostBuilder()
            .ConfigureAppConfiguration((builderContext, config) => {
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
            })
            .UseStartup<Startup>()
            .ConfigureServices( services => {
                // ...
            })
        );
        Client = _server.CreateClient();
    }
}

Использование класса Startup тестируемого проекта.

В моем базовом TestController я создавал консольный логгер так:

public WSTestController() {
    _log = new LoggerFactory().AddConsole().CreateLogger(this.GetType().Name);
    var testContext = new TestContext();
    _client = testContext.Client;
    // _services = testContext.Services;
}

Теперь я получаю следующее предупреждение:

controllers\WSTestController.cs(22,20): warning CS0618: 
'ConsoleLoggerExtensions.AddConsole(ILoggerFactory)' is obsolete: 
'This method is obsolete and will be removed in a future version. 
The recommended alternative is AddConsole(this ILoggingBuilder builder).' 

Я не могу получить регистратор с помощью DI, есть идеи, как я могу работать со сборщиком вместо устаревшего LoggerFactory, который скоро будет устаревшим ???

-

Я пытался ответить @ max-brodin, но получаю следующую ошибку:

The following constructor parameters did not have matching fixture data: ILogger log

Полагаю, это потому, что класс WSTestController не является контроллером сервера, созданного с помощью нового вызова WebHostBuilder (), поэтому он не управляется контейнером внедрения зависимостей.

Я также попытался выставить app.serviceProvider и затем использовать this.ServiceProvider.GetService(typeof(ILogger));, но он возвращает ноль.

Я просто не могу получить консольный логгер из класса, который тестирует TestServer

1 Ответ

0 голосов
/ 24 января 2019

Чтобы разрешить ILogger<> с помощью DI, начиная с .Net Core 2.2, вам необходимо зарегистрировать его в loggerbuilder, используя ConfigureLogging метод расширения:

_server = new TestServer(new WebHostBuilder()
        .ConfigureAppConfiguration((builderContext, config) => {
            config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
        })
        .UseStartup<Startup>()
        .ConfigureServices( services => {
            // ...
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
           logging.AddConsole();
        })
    );

Тогда вы можете просто вставить его в свой контроллер как обычно.

public class WSTestController : Controller
{ 
    private readonly ILogger<WSTestController> _logger;

    public WSTestController(ILogger<WSTestController> logger)
    {
       _logger = logger;
    }

}

Подробнее: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

...