使用XUnit进行功能测试中的类型化配置c#

问题描述 投票:2回答:2

我正在使用XUnit为我的API编写功能测试。我已经使用类型配置了我的API。像这样的东西:

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

当我尝试以相同的方式配置Microsoft.AspNetCore.TestHost类的TestServer时出现问题:

  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>

c# asp.net-core xunit
2个回答
1
投票

Configure方法在WebHostBuilderExtensions集合中的Microsoft.AspNetCore.Hosting类中定义,其签名如下:

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

这意味着您必须传递包含IApplicationBuilder实现实例的操作。您正在测试的API中的Startup类中可以找到类似的东西。

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
投票

非常感谢您的回复:

其他的事情是我需要添加对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>()
        );

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.