以前のバージョンの .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>
そして、Program
Web アプリ用に生成されたクラスを次のように使用できます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 { }
コード例移行ガイド。