web-dev-qa-db-ja.com

ASP.NET Core統合テストでWebApplicationFactory <T>からサービスを取得する

ASP.NET Coreでの統合テスト で詳しく説明されているように、_WebApplicationFactory<T>_を使用してテストを設定したいと思います。

テストの前に、実際のスタートアップクラスで構成されたサービスを使用して設定を行う必要があります。私の問題は、工場からサービスを受ける方法が見当たらないことです。

factory.Host.Services.GetRequiredService<ITheType>();が呼び出されるまで_factory.Server_がnullであることを除いて、factory.CreateClient();を使用して_factory.Server_からサービスを取得できます。

工場を使用してサービスを受けるために欠けている方法はありますか?

ありがとう。

17
Simon Vane

必要なサービスを取得するには、サービスプロバイダーからscopeを作成する必要があります。

using (var scope = AppFactory.Server.Host.Services.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<MyDatabaseContext>();
}
15

ご容赦ください。 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();
}
_
0
Lam Le