2-2 Web Application Factory (MVC)
Le principe de tests automatisés est qu'ils sont effectués de manière... automatisée! Cela veut dire qu'il n'y a pas d'intervention humaine dans l'exécution des tests et que vous ne devriez pas avoir à partir "à la main" vos projets au préalable.
On doit donc dire à notre projet de test, et aux tests exécutés, quel projet ils devraient tester afin qu'un serveur de test soit démarré automatiquement pour nous.
Cela est aussi l'occasion d'appliquer des configurations particulières, au besoin, à l'environnement de test.
.NET Core utilise le principe de WebApplicationFactory
pour générer une sorte de serveur test temporaire (objet TestServer
) basé sur l'application à tester (MVC ou API).
Il s'agit d'une classe qui permet de créer et de configurer une instance de l'application web à des fins de tests d'intégration. WebApplicationFactory
est fourni par la librairie Microsoft.AspNetCore.Mvc.Testing
.
Le principal avantage de WebApplicationFactory
est qu'il facilite la configuration et la gestion de l'environnement de test. Il permet de créer un serveur de test en mémoire et d'instancier un client HTTP pour envoyer des requêtes et tester les réponses de l'API ou des contrôleurs.
Voici quelques fonctionnalités clés:
-
Création d'une instance d'application:
WebApplicationFactory
crée une instance de l'application web en utilisant le même processus de démarrage que l'application réelle. Cela garantit que l'environnement de test est aussi proche que possible de l'environnement de production. -
Serveur de test en mémoire :
WebApplicationFactory
utilise le serveur de testTestServer
, qui est un serveur en mémoire conçu spécifiquement pour les tests d'intégration. Il permet d'éviter les problèmes liés à l'utilisation de ports réseau ou à l'exécution de plusieurs instances de tests en parallèle. -
Configuration personnalisée:
WebApplicationFactory
offre la possibilité de personnaliser la configuration de l'application pour les tests, par exemple en remplaçant certains services par des versions mockées ou en ajustant les paramètres de configuration. -
Client HTTP pour les tests:
WebApplicationFactory
fournis un client HTTP préconfiguré qui peut être utilisé pour envoyer des requêtes à l'application et tester les réponses. Ce client HTTP est configuré pour communiquer avec l'instance deTestServer
créée par laWebApplicationFactory
.
Ajouter la librairie NuGet Microsoft.AspNetCore.Mvc.Testing
au projet Tests
- Sous
Snowfall.Tests
->Manage NuGet Packages
- Faire une recherche pour
Microsoft.AspNetCore.Mvc.Testing
- Installer la librairie dans le projet
Snowfall.Tests
Créer la classe SnowfallMvcApplicationFactory
Nous allons premièrement créer un dossier pour les tests liés au projet MVC.
- Sous
Snowfall.Tests
->Add
->Directory
- Nommer le dossier
Web.Mvc
Ensuite,
- Sous
Snowfall.Tests/Web.Mvc
->Add
->Class/Interface
- Nommer la classe
SnowfallMvcApplicationFactory
namespace Snowfall.Tests.Web.Mvc;
public class SnowfallMvcApplicationFactory
{
}
Faire hériter la classe SnowfallMvcApplication
de WebApplicationFactory
Maintenant, on doit faire hériter la classe SnowfallMvcApplication
de WebApplicationFactory
afin qu'elle hérite des fonctionnalités requises permettant de créer un serveur de développement de test.
using Microsoft.AspNetCore.Mvc.Testing;
namespace Snowfall.Tests.TestsMvc;
public class SnowfallMvcApplication : WebApplicationFactory<>
{
}
Si vous remarquez, nous obtenons une erreur puisque WebApplicationFactory
doit être typé, c'est-à-dire qu'on doit préciser quelle application sera instanciée.
On doit faire référence ici à Program.cs
du projet Mvc
. Le problème est que Program.cs
n'est pas un fichier/classe publique. Donc, on doit faire une manipulation pour rendre ce dernier public.
Modifier la portée de Program.cs
Pour modifier la portée de Program.cs
, on peut simplement ajouter ceci complètement dans le bas du fichier:
//...
app.MapControllerRoute(
name: "default",
pattern: "{controller=Evenements}/{action=Index}/{id?}");
app.Run();
namespace Snowfall.Web.Mvc
{
public partial class Program { }
}
Faire référence à Program
dans SnowfallMvcApplicationFactory
On peut maintenant faire référence à Program
puisque ce dernier est public.
using Microsoft.AspNetCore.Mvc.Testing;
using Snowfall.Web.Mvc;
namespace Snowfall.Tests.Web.Mvc;
public class SnowfallMvcApplicationFactory : WebApplicationFactory<Program>
{
}
Préciser l'environnement Test
dans SnowfallMvcApplicationFactory
Pour que l'application démarre avec la bonne configuration d'environnement, on peut le spécifier via la fonction ConfigureWebHost
:
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Snowfall.Web.Mvc;
namespace Snowfall.Tests.Web.Mvc;
public class SnowfallMvcApplicationFactory : WebApplicationFactory<Program>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.UseEnvironment("Test");
}
}