スタートアップクラスなしでのASP.NET Core 6.0の統合テストとホスティング 質問する

スタートアップクラスなしでのASP.NET Core 6.0の統合テストとホスティング 質問する

以前のバージョンの .NET Core で単体テストを設定するには、次の方法で Web アプリまたは Web API をテスト プロジェクトでホストできます。

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

現在の .NET 6.0 ではクラスの概念が使用されていないStartupため、参照できませんでした。テスト プロジェクトで ASP.NET Core アプリを適切かつクリーンな方法でホストするにはどうすればよいでしょうか?

ベストアンサー1

必要に応じて、汎用ホスティング モデル (スタートアップ クラスを使用するモデル) に切り替えることができることに注意してください。

統合テストを設定するには新しい最小限のホスティングモデルたとえば、csproj に次のプロパティを追加することで、Web プロジェクトの内部をテスト プロジェクトから表示できるようにすることができます。

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

そして、ProgramWeb アプリ用に生成されたクラスを次のように使用できますWebApplicationFactory

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<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");

または、 を使用する代わりに、InternalsVisibleToパブリック部分クラスを宣言して使用することもできますProgram。たとえば、トップレベルのステートメント ファイルの下部に次を追加します (残りは同じです)。

public partial class Program { }

コード例移行ガイド

おすすめ記事