如何在 .Net 6 中创建测试服务器? [复制]

Posted

技术标签:

【中文标题】如何在 .Net 6 中创建测试服务器? [复制]【英文标题】:How do you create a test server in .Net 6? [duplicate] 【发布时间】:2021-11-09 11:52:20 【问题描述】:

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

 var server = new TestServer(new WebHostBuilder().UseStartup<Startup>());

【问题讨论】:

为了炫耀语言的新特性,去掉了启动类,并不代表不能放回去。 UseStartup&lt;Startup&gt;() 方法仍然存在,ASP.NET 团队只是决定展示新的语言功能并将所有内容添加到Program 文件中,这并不意味着您不能放置它回来了,如果你想重用代码,我敦促你这样做 啊,好的,谢谢,那我就放回去吧。 【参考方案1】:

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

<ItemGroup>
    <InternalsVisibleToInclude="Insert testing project name here" />
</ItemGroup>

并添加

public partial class Program  

到 Program.cs 文件的底部

【讨论】:

这个已经至少有两个重复了【参考方案2】:

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

  <ItemGroup>
    <InternalsVisibleTo Include ="YourTestProjectName"/>
  </ItemGroup>

然后您可以从为 Web 应用生成的 Program 类继承您的 WebApplicationFactory

class MyWebApplication : WebApplicationFactory<Program>

    protected override IHost CreateHost(IHostBuilder builder)
    
        // shared extra set up goes here
        return base.CreateHost(builder);
    

然后在测试中:

var application = new MyTestApplication();
var client = application.CreateClient();
var response = await client.GetStringAsync("/api/WeatherForecast");

或者直接使用测试中的WebApplicationFactory&lt;Program&gt;

var application = new WebApplicationFactory<Program>()
.WithWebHostBuilder(builder =>

    builder .ConfigureServices(services =>
    
       // set up servises
    );
);
var client = application.CreateClient();
var response = await client.GetStringAsync("/api/WeatherForecast");

来自migration guide的代码示例。

【讨论】:

以上是关于如何在 .Net 6 中创建测试服务器? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中创建子域? [复制]

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

如何使用 JUnit 5 在 Kotlin 中创建 TestContainers 基测试类

如何在Javascript中创建动态文件+链接以供下载? [复制]

如何在 asp.net 中创建 RESTful Web 服务?

如何在 Spring Boot 中创建不同的 ThreadPoolTask​​Executor? [复制]