Mah*_*Ali 3 c# integration-testing asp.net-core minimal-apis
能够在集成测试中自定义主机配置有助于避免调用在测试期间根本不应运行的服务。使用标准Startup模型可以轻松实现这一点,CreateHostBuilder覆盖WebApplicationFactory. 我使用“最小 API”方法尝试了很多事情,但无法弄清楚。
使用该模型的完整示例Startup如下:
程序.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();
}
Run Code Online (Sandbox Code Playgroud)
正如您可以想象的那样,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
}
Run Code Online (Sandbox Code Playgroud)
但是,尝试相同的方法会在我的集成测试启动时引发异常:
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.
Run Code Online (Sandbox Code Playgroud)
由于我没有Startup课,所以我不知道如何正确地做到这一点。事实上,由于这在我所有的 Web 项目中都很常见,所以我暂时完全放弃了 Minimal API,直到我弄清楚如何在没有类的情况下正确实现这一点Startup。
PS:我已准备好所有“部分程序”和“InternalsVisibleTo”,如此处所述。
Dou*_*ter 12
为了实现此目的,您必须在最小 API Program.cs 运行之前和之后提供两次配置值。
我是这样做的:
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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4715 次 |
| 最近记录: |