.NET Core 控制台应用程序的 WebApplicationFactory 是否有等效项?

问题描述 投票:0回答:1

我正在为 .NET 6.0 C# 控制台应用程序创建集成测试。有没有一种方法可以像 ASP.NET Core 使用

WebApplicationFactory
托管和测试应用程序一样对其进行测试?我希望能够在运行测试时以与
WebApplicationFactory
相同的方式更改一些依赖项注入服务,因此简单地运行控制台应用程序或调用
Program.Main
方法不是我想要的正在寻找。

我知道您无法使用

CreateClient
并使用
HttpClient
与控制台应用程序进行通信,但也许键盘输入可以通过管道传输到它。

目前我正在使用

Process
手动启动它并捕获输出,这在一定程度上有效,但没有提供一种直接的方法来自定义依赖项注入、不同的配置、模拟、存根、伪造等,如
WebApplicationFactory
所提供的网络应用程序。

c# asp.net-core console-application .net-6.0
1个回答
0
投票

考虑使用 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

希望这能让您开始!

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