AspNet核心集成测试,将参数传递给WebApplicationFactory

Sat*_*ies 3 c# integration-testing asp.net-core

我的应用程序设计为独立的aspnet core webapi自主机可执行文件.

要启动可执行文件,必须将配置文件路径作为命令行参数传递(例如MyServer.exe --config "path-to-config-file")

我想通过集成测试来测试它(以下页面:https : //docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.1)

我的问题 - 命令行参数如何传递给WebApplicationFactory

谢谢

Chr*_*att 8

命令行参数由命令行配置提供程序处理.换句话说,最终结果是您只需在配置根目录中结束这些值,然后您就可以从以后访问它们以利用它们.鉴于此,您可以在测试中使用任何配置方式来提供相同的值,甚至只需直接写入配置.

如果您还没有,那么您应该Startup专门为您的类进行子类化测试,例如:

public class TestStartup : Startup
{
    public TestStartup(IConfiguration configuration)
        : base(configuration)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在TestStartup构造函数中,您可以在配置中设置适当的值:

configuration["config"] = "path-to-config-file";
Run Code Online (Sandbox Code Playgroud)

请记住,类型param WebApplicationFactory只是用于确定"入口点",即Program测试主机将要运行以自行引导.因此,您应该继续使用WebApplicationFactory<Startup>,然后配置您的测试主机以使用您的TestStartup代替:

public MyTests(WebApplicationFactory<Startup> factory)
{
    factory = factory.WithWebHostBuilder(builder => builder.UseStartup<TestStartup>());
}
Run Code Online (Sandbox Code Playgroud)


stu*_*tun 5

我正在使用 .NET 6.0,这就是我如何实现将命令行参数从我Program.Main(string[] args)自定义 WebApplicationFactory<TStartup>.

public class CustomWebApplicationFactory<TStartup>
    : WebApplicationFactory<TStartup> where TStartup : class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // Notice there is no `--` prefix in "config"
        builder.UseSetting("config", "path-to-config-file");

        // other stuff as usual
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在文件中放置一个调试器断点Program.csMain(string[] args)您将看到“config”命令行参数args变为"--config=path-toconfig-file".