ASP.NET Coreでの統合テスト で詳しく説明されているように、_WebApplicationFactory<T>
_を使用してテストを設定したいと思います。
テストの前に、実際のスタートアップクラスで構成されたサービスを使用して設定を行う必要があります。私の問題は、工場からサービスを受ける方法が見当たらないことです。
factory.Host.Services.GetRequiredService<ITheType>();
が呼び出されるまで_factory.Server
_がnullであることを除いて、factory.CreateClient();
を使用して_factory.Server
_からサービスを取得できます。
工場を使用してサービスを受けるために欠けている方法はありますか?
ありがとう。
必要なサービスを取得するには、サービスプロバイダーからscopeを作成する必要があります。
using (var scope = AppFactory.Server.Host.Services.CreateScope())
{
var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>();
}
ご容赦ください。 Net Core 2.1を求めているのは知っていますが、v3.1以降では、人々もここに来ました...
私のプロジェクトではNet Core 3.1を使用しています。 Alexey Starchikovの提案のようにAppFactory.Server.Host.Services.CreateScope()
を使用すると、このエラーが発生します。
_The TestServer constructor was not called with a IWebHostBuilder so IWebHost is not available.
_
ここで注意 設計による
だから私は以下のアプローチを使用します。テストクラスのコンストラクタにデータベースシードを入れました。 factory.CreateClient()
を呼び出す必要がないことに注意してください。私はいつものようにテストメソッドでクライアント変数を作成します。
_using (var scope = this.factory.Services.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();
// Seeding ...
dbContext.SaveChanges();
}
_