在使用asp.net Core 6 Minimal api模型的集成测试中覆盖主机配置



能够在集成测试中自定义Host配置对于避免调用在测试期间根本不应该运行的服务非常有用。这很容易实现使用标准的Startup模型,覆盖WebApplicationFactoryCreateHostBuilder。我用"Minimal api"尝试了很多很多东西。

使用Startup模型的完整示例是这样的:

Program.cs:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
// This is a service that downloads Configuration from the internet, to be used
// as a source for `IConfiguration`, just like any `appsettings.json`.
// I don't want this running during testing
.AddConfigServer();
}

你可以想象,AddConfigServer调用一个外部web服务器来下载我想在我的应用程序启动时使用的配置,但我绝对不希望我的集成测试调用这个外部web服务器,有几个原因:不想依赖外部服务,不想用测试请求敲打我的配置服务器,不想让我的服务器定制暴露在我的测试中,等等。

使用Startup模型,我可以很容易地改变这种行为:

public class MyWebApplicationFactory : WebApplicationFactory<Program>
{
protected override IHostBuilder CreateHostBuilder() =>
Host.CreateDefaultBuilder()
// No AddConfigServer for my integration tests
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
//... other customizations
}

然而,尝试同样的方法会在集成测试启动时抛出异常:

System.InvalidOperationException : No application configured. Please specify an application via IWebHostBuilder.UseStartup, IWebHostBuilder.Configure, or specifying the startup assembly via StartupAssemblyKey in the web host configuration.

因为我没有Startup类,我不知道如何正确地做到这一点。事实上,由于这在我所有的web项目中都很常见,我暂时放弃了Minimal api,直到我弄清楚如何在没有Startup类的情况下正确实现这一点。

p。我有所有的"部分程序"。和";InternalsVisibleTo"在适当的位置,如这里所述。

为了使此工作,您必须提供两次配置值之前同时提供后和

我是这样做的:

public class MyFixture : WebApplicationFactory<Program>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
var configurationValues = new Dictionary<string, string>
{
{ "MyConfigSetting", "Value" }
};
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(configurationValues)
.Build();
builder
// This configuration is used during the creation of the application
// (e.g. BEFORE WebApplication.CreateBuilder(args) is called in Program.cs).
.UseConfiguration(configuration)
.ConfigureAppConfiguration(configurationBuilder =>
{
// This overrides configuration settings that were added as part 
// of building the Host (e.g. calling WebApplication.CreateBuilder(args)).
configurationBuilder.AddInMemoryCollection(configurationValues);
});
}
}

相关内容

  • 没有找到相关文章

最新更新