【问题标题】:Integration test and hosting ASP.NET Core 6.0 without Startup class没有 Startup 类的集成测试和托管 ASP.NET Core 6.0
【发布时间】:2022-01-02 16:45:11
【问题描述】:

要在以前版本的 .Net Core 中设置单元测试,我可以通过以下方式在测试项目中托管我的 WebApp 或 WebAPI:

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

当前的.Net 6.0 没有使用Startup 类概念,因此无法引用。如何以正确且干净的方式在测试项目中托管 AspNet 应用程序?

【问题讨论】:

  • 我有一个 repo 显示使用 WebApplicationFactory&lt;T&gt; 进行单元/集成测试与最小 API,也许这会帮助你:github.com/martincostello/…
  • @martin-costello 我知道诀窍是添加public partial class Program{}

标签: c# unit-testing asp.net-core .net-6.0


【解决方案1】:

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

要使用new minimal hosting model 设置集成测试,您可以通过将 next 属性添加到 csproj 来使 Web 项目内部对测试可见:

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

然后您可以使用为WebApplicationFactory 中的Web 应用程序生成的Program 类:

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

然后在测试中:

var application = new MyWebApplication();
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的代码示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多