Aller au contenu principal

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:

  1. 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.

  2. Serveur de test en mémoire : WebApplicationFactory utilise le serveur de test TestServer, 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.

  3. 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.

  4. 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 de TestServer créée par la WebApplicationFactory.

Ajouter la librairie NuGet Microsoft.AspNetCore.Mvc.Testing au projet Tests

  1. Sous Snowfall.Tests -> Manage NuGet Packages
  2. Faire une recherche pour Microsoft.AspNetCore.Mvc.Testing
  3. 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.

  1. Sous Snowfall.Tests -> Add -> Directory
  2. Nommer le dossier Web.Mvc

Ensuite,

  1. Sous Snowfall.Tests/Web.Mvc -> Add -> Class/Interface
  2. Nommer la classe SnowfallMvcApplicationFactory
Snowfall.Tests/Web.Mvc/SnowfallMvcApplicationFactory.cs
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.

Snowfall.Tests/TestsMvc/SnowfallMvcApplication.cs
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:

Snowfall.Web.Mvc/Program.cs
//...

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.

Snowfall.Tests/Web.Mvc/SnowfallMvcApplicationFactory.cs
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:

Snowfall.Tests/Web.Mvc/SnowfallMvcApplicationFactory.cs
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");
}
}