Aller au contenu principal

2-3 Premier test d'intégration (MVC)

Comme premier test d'intégration, nous allons charger la page d'accueil via l'action Index du contrôleur Evenements, correspondant à la route "/".

Créer une coquille de test AccueilTests utilisant SnowfallMvcApplicationFactory

Pour créer un test qui utilisera l'application en mode Test, on peut procéder ainsi:

  1. Créer un dossier TestsIntegration sous Web.Mvc via Add -> Directory

  2. Créer une classe AccueilTests sous le dossier TestsIntegration via Add -> Class/Interface

    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    namespace Snowfall.Tests.Web.Mvc.TestsIntegration;

    public class AccueilTests
    {

    }
  3. Ensuite, on peut faire hériter la classe de IClassFixture<SnowfallMvcApplicationFactory>. Évidemment, remplacez le type SnowfallMvcApplicationFactory par celui de votre propre WebApplicationFactory

    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    namespace Snowfall.Tests.Web.Mvc.TestsIntegration;

    public class AccueilTests : IClassFixture<SnowfallMvcApplicationFactory>
    {

    }
  4. Puis, on reçoit via le constructeur l'instance de l'application

    Snowfall.Tests/TestsMvc/TestsIntegration/AccueilTests.cs
    namespace Snowfall.Tests.Web.Mvc.TestsIntegration;

    public class AccueilTests : IClassFixture<SnowfallMvcApplicationFactory>
    {
    private readonly SnowfallMvcApplicationFactory _application;

    public AccueilTests(SnowfallMvcApplicationFactory application)
    {
    _application = application;
    }
    }
  5. Finalement, on peut ajouter une première fonction de test qui sera responsable d'obtenir et de vérifier la page d'accueil, soit Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte.

    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    namespace Snowfall.Tests.Web.Mvc.TestsIntegration;

    public class AccueilTests : IClassFixture<SnowfallMvcApplicationFactory>
    {
    private readonly SnowfallMvcApplicationFactory _application;

    public AccueilTests(SnowfallMvcApplicationFactory application)
    {
    _application = application;
    }

    [Fact]
    public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
    {

    }
    }
    info

    On essaie autant que possible d'utiliser le format:

    • Le nom de la méthode ou de l'action testée

    • Le scénario ou cas d'utilisation testé

    • Le résultat ou comportement attendu

    Ici, on veut tester qu'il est possible d'obtenir la page d'accueil en tant qu'utilisateur anonyme (non connecté) et que la page affichera du texte attendu.

Test du test

Vous pouvez exécuter le test et normalement tout devrait être au vert pour le moment! Rien n'est réellement testé, mais on veut s'assurer que le tout compile et que les tests sont exécutés.

Créer un client HTTP lié à l'instance de l'application de test

Peut-être vous demandez-vous comment allons-nous faire cette première requête pour tester la page d'accueil.

Pour faire des requêtes, il nous faut un client HTTP! Pour créer ce dernier, on doit appeler CreateClient sur l'instance de l'application:

Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
[Fact]
public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
{
// Arrange
HttpClient client = _application.CreateClient();
}

Test du test

Exécutez le test. Si quelque chose a à échouer avec la configuration initiale, c'est ici que cela deviendra apparent. Si tout est au vert, vous pouvez poursuivre!

Vérifier que la base de données snowfall_tests a été migrée

Vous pouvez en profiter pour vérifier que votre base de données test contient bien les tables.

En effet, le fait d'avoir instancié l'application en mode test devrait avoir exécuté les migrations. Comme via appsettings.Test.json c'est la BD de test qui est référencée, les migrations ont dû être exécutées dans cette dernière.

Faire une requête via HttpClient

Il est maintenant temps d'obtenir la page d'accueil. On peut utiliser GetAsync avec l'URL désirée en paramètre sur le client HTTP pour effectuer une requête.

Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
[Fact]
public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
{
// Arrange
HttpClient client = _application.CreateClient();

// Act
string url = "/";
HttpResponseMessage reponse = await client.GetAsync(url);
}

Vérifier que le retour est un succès

On peut ensuite vérifier que le retour est un succès via reponse.EnsureSuccessStatusCode():

Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
[Fact]
public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
{
// Arrange
HttpClient client = _application.CreateClient();

// Act
string url = "/";
HttpResponseMessage reponse = await client.GetAsync(url);

// Assert
reponse.EnsureSuccessStatusCode();
}

Vérifier que la page contient un terme précis

Pour vérifier que le contenu de la page est bien affiché comme attendu et qu'il ne s'agit pas, par exemple, d'une page vide ou avec un message d'erreur quelconque, on peut rechercher un terme dans la page.

Par exemple, il devrait normalement y avoir le terme "Filtrer par ville" qui est présent dans la barre de filtre à gauche.

Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
[Fact]
public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
{
// Arrange
HttpClient client = _application.CreateClient();

// Act
string url = "/";
HttpResponseMessage reponse = await client.GetAsync(url);

// Assert
reponse.EnsureSuccessStatusCode();
string contenu = await reponse.Content.ReadAsStringAsync();
Assert.Contains("Filtrer par ville", contenu);
}

Vous pouvez exécuter le test et le tout devrait fonctionner.