我正在为 .NET 6.0 C# 控制台应用程序创建集成测试。有没有一种方法可以像 ASP.NET Core 使用
WebApplicationFactory
托管和测试应用程序一样对其进行测试?我希望能够在运行测试时以与 WebApplicationFactory
相同的方式更改一些依赖项注入服务,因此简单地运行控制台应用程序或调用 Program.Main
方法不是我想要的正在寻找。
我知道您无法使用
CreateClient
并使用 HttpClient
与控制台应用程序进行通信,但也许键盘输入可以通过管道传输到它。
目前我正在使用
Process
手动启动它并捕获输出,这在一定程度上有效,但没有提供一种直接的方法来自定义依赖项注入、不同的配置、模拟、存根、伪造等,如 WebApplicationFactory
所提供的网络应用程序。
考虑使用 Worker Service 模板而不是普通的控制台应用程序,您将免费获得依赖项注入和配置。以下是您如何扩展
WebApplicationFactory
以进行主机应用程序的端到端测试。
public class HostApplicationFactory<TEntryPoint> : WebApplicationFactory<TEntryPoint>
where TEntryPoint : class
{
private readonly Action<IWebHostBuilder> _configuration;
public HostApplicationFactory(Action<IWebHostBuilder> configuration)
{
_configuration = configuration;
}
protected override void ConfigureWebHost(IWebHostBuilder builder) =>
_configuration(builder.Configure(_ => { }));
public Task RunHostAsync()
{
var host = Services.GetRequiredService<IHost>();
return host.WaitForShutdownAsync();
}
}
以及如何使用它...
await using HostApplicationFactory<Program> hostApplicationFactory =
new(configuration: builder =>
{
// Replace any appsettings like dynamic ports from test containers
builder.UseSetting("SomeAppSetting:Value", "replacement value");
builder.ConfigureTestServices(services =>
{
// Override any services here
});
});
await hostApplicationFactory.RunHostAsync();
这是假设您的主机运行完成并关闭。您还可以从容器中获取
IHostApplicationLifetime
以停止您的应用程序的测试。
这里需要注意的最大问题是覆盖
ConfigureWebHost
。需要 builder.Configure(_ => { })
来为 WebApplicationFactory
创建空的 Web 应用程序。没有它,你会得到一个错误。这是帮助我弄清楚的 SO 答案的链接:https://stackoverflow.com/a/69974323/4465532
希望这能让您开始!