集成测试和托管 ASP.NET Core 6.0,无需启动类

use*_*923 20 c# unit-testing asp.net-core .net-6.0

要在以前版本的 .NET Core 中设置单元测试,我可以通过以下方式在测试项目中托管我的 Web 应用程序或 Web API:

IHost host = Host.CreateDefaultBuilder()
    .ConfigureWebHostDefaults(config =>
    {
        config.UseStartup<MyWebApp.Startup>();
        config.UseUrls("https://localhost:44331/");
        ...    
    })
    .Build();
Run Code Online (Sandbox Code Playgroud)

当前.NET 6.0不使用Startup类概念,因此无法引用。如何以正确、干净的方式在测试项目中托管 ASP.NET Core 应用程序?

Gur*_*ron 26

请注意,如果需要,您可以切换到通用托管模型(使用启动类的模型)。

要使用新的最小托管模型设置集成测试,您可以使 Web 项目内部结构对测试项目可见,例如通过向 csproj 添加下一个属性:

<ItemGroup>
  <InternalsVisibleTo Include ="YourTestProjectName"/>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

然后您可以Program在以下位置使用为 Web 应用程序生成的类WebApplicationFactory

class MyWebApplication : WebApplicationFactory<Program>
{
    protected override IHost CreateHost(IHostBuilder builder)
    {
        // shared extra set up goes here
        return base.CreateHost(builder);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在测试中:

var application = new MyWebApplication();
var client = application.CreateClient();
var response = await client.GetStringAsync("/api/WeatherForecast");
Run Code Online (Sandbox Code Playgroud)

或者WebApplicationFactory<Program>直接使用测试:

var application = new WebApplicationFactory<Program>()
    .WithWebHostBuilder(builder =>
    {
        builder.ConfigureServices(services =>
        {
           // set up servises
        });
    });
var client = application.CreateClient();
var response = await client.GetStringAsync("/api/WeatherForecast");
Run Code Online (Sandbox Code Playgroud)

或者,InternalsVisibleTo您可以声明公共分部Program类并使用它,而不是使用它。例如在顶级语句文件的底部添加next(其余相同):

class MyWebApplication : WebApplicationFactory<Program>
{
    protected override IHost CreateHost(IHostBuilder builder)
    {
        // shared extra set up goes here
        return base.CreateHost(builder);
    }
}
Run Code Online (Sandbox Code Playgroud)

迁移指南中的代码示例。

  • 知道如何在不使用 WebApplicationFactory 或 TestServer 的情况下做到这一点吗?我正在尝试实施 PactNet 提供商测试,但尚未弄清楚 https://github.com/pact-foundation/pact-net (2认同)