Почему я получаю эту ошибку от NLog во время интеграционного тестирования: не удается найти LayoutRenderer - PullRequest
0 голосов
/ 09 апреля 2020

Я добавил некоторые как pnet средства визуализации макета в свою конфигурацию NLog, и все отлично работает для моего веб-сайта, но когда я пытаюсь запустить свои интеграционные тесты, они выдают следующее сообщение об ошибке:

NLog.NLogConfigurationException: Ошибка при установке свойства 'Layout' в NLog.Targets.DatabaseParameterInfo ----> System.ArgumentException: невозможно найти LayoutRenderer: 'as pnet -request-cook ie'. Не включен ли NLog.Web?

Первоначально я хотел последовать их предложению и добавить пакет NLog.Web.AspNetCore в мой тестовый проект интеграции. Это ничего не сделало.

Вот как выглядит моя настройка интеграционного теста:

[OneTimeSetUp]
public static void BaseOneTimeSetUp()
{
    var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";
    Assume.That(environment, Is.AnyOf("Development", "CI"), "Integration tests can only run in one of those environments");

    var serviceCollection = new ServiceCollection();
    serviceCollection.AddSingleton<IHostingEnvironment>(p =>
    {
        var mock = new Mock<IHostingEnvironment>();
        mock.SetupGet(m => m.ContentRootPath).Returns(TestContext.CurrentContext.TestDirectory);
        mock.SetupGet(m => m.EnvironmentName).Returns(environment);
        return mock.Object;
    });

    Startup.AddConfiguration(serviceCollection);  //throws NLogConfigurationException
}

А вот моя реализация метода StartConnect AddConfiguration:

public static void AddConfiguration(IServiceCollection services)
{
    services.AddSingleton<IConfiguration>(s =>
    {
        var env = s.GetService<IHostingEnvironment>();

        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        var config = builder.Build();

        // This next line throws the NLogConfigurationException
        LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));

        return config;
    });
}

1 Ответ

2 голосов
/ 09 апреля 2020

Интеграционный тест не вызывает метод UseNLog для asp. net WebHost, как показано в их примере кода :

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders();
        logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
    })
    .UseNLog();  // NLog: setup NLog for Dependency injection

Если вы этого не сделаете Если вы хотите настроить WebHost для своих тестов, вы можете обойтись с Mock<IWebHostBuilder>.

Все, что вам нужно сделать, это добавить это в настройки теста перед настройкой NLog:

var mockHostBuilder = new Mock<IWebHostBuilder>();
mockHostBuilder.Object.UseNLog();
...