Типизированная конфигурация в функциональном тесте с XUnit c # - PullRequest
2 голосов
/ 08 марта 2019

Я пишу функциональные тесты для моего API с XUnit. Я настроил свой API, используя типы. Примерно так:

public void ConfigureServices(IServiceCollection services)
{
  services.ConfigureServices(services)
          .Configure<SqlServerData>(Configuration.GetSection(nameof(SqlServerData)))
          .Configure<SolrData>(Configuration.GetSection(nameof(SolrData)));
}

Проблема возникает, когда я пытаюсь настроить мой TestServer класса Microsoft.AspNetCore.TestHost таким же образом:

  Server = new TestServer(
    new WebHostBuilder()
      .ConfigureServices(services =>
      {
         //SOME STUFF
      })
      .Configure(Configuration.GetSection(nameof(SqlServerData)))
      .UseStartup<TestStartup>()
 );

Я получаю следующую ошибку

не может конвертировать из Microsoft.Extensions.Configuration.IConfigurationSection в System.Action<Microsoft.AspNetCore.Builder.IApplicationBuilder>

Ответы [ 2 ]

1 голос
/ 08 марта 2019
Метод

Configure определен в классе WebHostBuilderExtensions в сборке Microsoft.AspNetCore.Hosting, и его подпись выглядит следующим образом:

public static IWebHostBuilder Configure(this IWebHostBuilder hostBuilder,
  Action<IApplicationBuilder> configureApp)
{
    ...
}

Это означает, что вы должны передать действие, содержащее IApplicationBuilder экземпляр реализации. Нечто подобное вы можете найти в классе Startup в тестируемом API.

public void Configure(IApplicationBuilder app)
{
}

Другие зависимости также могут быть внедрены в методе Configure, при условии, что они зарегистрированы в используемом вами контейнере DI. Configure() вызывается средой выполнения, поэтому вам обычно не нужно явно вызывать ее.

Если вам нужно получить экземпляр вашей конфигурации в методе Configure, вы можете получить его (или любую другую зарегистрированную зависимость) из экземпляра IServiceProvider, который предоставляется объектом IApplicationBuilder объекта настраивая действие, которое вы передаете методу:

Server = new TestServer(new WebHostBuilder()
    .Configure(appBuilder =>
    {
        //get the required service from the appBuilder's ApplicationServices property
        var config = appBuilder.ApplicationServices.GetService<IConfiguration>();

        var section = config.GetSection("YourSection");
        //Use your section here.
    })
    .UseStartup<TestStartup>()

Однако, пожалуйста, будьте осторожны, потому что в этот момент может быть уже слишком поздно для настройки службы. Configure() в основном используется для настройки конвейера запросов. Даже при том, что у вас может быть законный вариант использования для использования конфигурации в нем, вы должны убедиться, что вы не можете сделать это в методе ConfigureServices().

Надеюсь, это поможет!

0 голосов
/ 08 марта 2019

Большое спасибо за ваш ответ:

Другое дело, мне нужно было добавить ссылку на Nuget:

Microsoft.Extensions.Options.ConfigurationExtensions

Теперь я могу сделать что-то вроде:

Server = new TestServer(
            new WebHostBuilder()
            .ConfigureServices(services =>
            {

                services.Configure<SqlServerData>(Configuration.GetSection("SqlServerData"));
                services.Configure<SolrData>(Configuration.GetSection("SolrData"));
            })
            .UseStartup<TestStartup>()
        );

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...