我正在使用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>
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()
方法中执行此操作。
希望这可以帮助!
非常感谢您的回复:
其他的事情是我需要添加对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>()
);
谢谢