代码之家  ›  专栏  ›  技术社区  ›  opensas

netcore:从测试控制器使用LoggerBuilder创建控制台记录器

  •  0
  • opensas  · 技术社区  · 6 年前

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

    使用要测试的项目的启动类。

    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吗???

    --

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

    我猜这是因为类WSTestController不是用新的WebHostBuilder()调用创建的服务器的控制器,所以它不是由dededependency注入容器管理的。

    我也试着暴露应用程序服务提供商然后使用 this.ServiceProvider.GetService(typeof(ILogger)); 但它返回null。

    我只是无法从测试测试服务器的类中获取控制台记录器

    1 回复  |  直到 6 年前
        1
  •  0
  •   Max Brodin    6 年前

    为了解决 ILogger<> 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