web-dev-qa-db-fra.com

Obtenez le service de WebApplicationFactory <T> dans les tests d'intégration ASP.NET Core

Je veux configurer mes tests en utilisant WebApplicationFactory<T> Comme détaillé dans Tests d'intégration dans ASP.NET Core .

Avant certains de mes tests, j'ai besoin d'utiliser un service configuré dans la vraie classe de démarrage pour configurer les choses. Le problème que j'ai, c'est que je ne vois pas de moyen d'obtenir un service de l'usine.

Je pourrais obtenir un service de factory.Server En utilisant factory.Host.Services.GetRequiredService<ITheType>(); sauf que factory.Server Est nul jusqu'à ce que factory.CreateClient(); ait été appelé.

Existe-t-il un moyen qui me manque pour obtenir un service en utilisant l'usine?

Merci.

17
Simon Vane

Vous devez créer une étendue auprès du fournisseur de services pour obtenir le service nécessaire:

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

Veuillez me pardonner. Je sais que vous demandez Net Core 2.1, mais depuis la v3.1 +, les gens sont également venus ici ...

Mon projet utilise Net Core 3.1. Lorsque j'utilise AppFactory.Server.Host.Services.CreateScope() comme la suggestion d'Alexey Starchikov, je rencontre cette erreur.

The TestServer constructor was not called with a IWebHostBuilder so IWebHost is not available.

Noté ici, par des conceptions.

J'utilise donc l'approche ci-dessous. J'ai mis l'ensemencement de base de données dans le constructeur de la classe de test. Notez que je n'ai pas besoin d'appeler factory.CreateClient(). Je crée des variables client dans les méthodes de test comme d'habitude.

using (var scope = this.factory.Services.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<YourDbContext>();

    // Seeding ...

    dbContext.SaveChanges();
}
0
Lam Le