如何在 .NET 6 中创建测试服务器?

Tho*_*and 10 c# asp.net .net-6.0

我需要为 ASP.NET 6 API 编写一些单元测试,并且需要创建一个测试服务器来验证授权。但是,由于启动类已被删除,我不知道应该使用什么作为创建测试服务器的入口点。这是以前版本中创建的方式。

 var server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 10

您可以使用WebApplicationFactory(它基于docs,是一个包装器,TestServer并公开属性和方法来创建和获取它,如CreateServerServer)进行集成测试。要使用新的最小托管模型进行设置,您需要使 Web 项目内部结构对测试项目可见,例如通过向 csproj 添加下一个属性:

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

然后你可以WebApplicationFactoryProgram为网络应用程序生成的类继承你的:

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 MyTestApplication();
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类显式声明为部分类。例如,将以下内容添加到顶级语句文件的底部(通常Program.cs):

public partial class Program { }
Run Code Online (Sandbox Code Playgroud)

迁移指南中的代码示例。


Tho*_*and 8

问题最终是默认情况下无法发现 Program.cs,因此我最终将其添加到 ASP.NET Core .csproj 文件中。

<ItemGroup>
    <InternalsVisibleToInclude="{Insert testing project name here}" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

并添加

public partial class Program { }
Run Code Online (Sandbox Code Playgroud)

到 Program.cs 文件的底部