Aller au contenu principal

2-6-1 Création d'une classe de base de test

Nous allons utiliser le même principe que pour les tests d'intégration de l'API et créer une classe de base pour les tests.

  1. Sous le dossier Snowfall.Tests/Web.Mvc/TestsIntegration, créez une classe WebMvcIntegrationTestBase.
  2. La classe sera essentiellement la même que pour la base de l'API, simplement qu'elle vous permettra de traiter indépendamment les repo dont vous avez besoin ou encore d'ajouter des fonctions personnalisées au besoin.
    Snowfall.Tests/Web.Mvc/TestsIntegration/WebMvcIntegrationTestBase.cs
    using Microsoft.Extensions.DependencyInjection;
    using Snowfall.Data.Repositories;

    namespace Snowfall.Tests.Web.Mvc.TestsIntegration;

    [Collection("Test Database Collection")]
    public abstract class WebMvcIntegrationTestBase :
    IClassFixture<SnowfallMvcApplicationFactory>,
    IAsyncLifetime,
    IDisposable
    {
    protected readonly SnowfallMvcApplicationFactory Application;
    protected readonly TestDatabaseFixture Database;
    protected HttpClient Client { get; private set; } = null!;

    protected readonly IVilleRepository VilleRepository;
    protected readonly IEvenementRepository EvenementRepository;

    private readonly IServiceScope _scope;

    protected WebMvcIntegrationTestBase(
    SnowfallMvcApplicationFactory application,
    TestDatabaseFixture database)
    {
    Application = application;
    Database = database;

    _scope = Application.Services.CreateScope();
    VilleRepository = _scope.ServiceProvider.GetRequiredService<IVilleRepository>();
    EvenementRepository = _scope.ServiceProvider.GetRequiredService<IEvenementRepository>();
    }

    /// <summary>
    /// Avant chaque test, crée un nouveau client et réinitialise la BD.
    /// </summary>
    public async Task InitializeAsync()
    {
    await Database.ResetDatabaseAsync();
    Client = Application.CreateClient();
    }

    public Task DisposeAsync() => Task.CompletedTask;

    public void Dispose() => _scope.Dispose();
    }
  3. Finalement, modifiez le test MVC existant (AccueilTest) pour qu'il hérite de la classe de base et retirez l'attribut de collection
    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    public class AccueilTests : WebMvcIntegrationTestBase
  4. Retirez les propriétés _application et _databaseFixture en plus d'appeler le constructeur de base.
    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    public class AccueilTests : WebMvcIntegrationTestBase
    {
    public AccueilTests(
    SnowfallMvcApplicationFactory application,
    TestDatabaseFixture databaseFixture) : base(application, databaseFixture)
    { }
  5. Retirez les fonctions InitializeAsync et DisposeAsync
  6. Modifiez la fonction de test pour qu'elle utilise Client de la classe de base.
    Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cs
    public class AccueilTests : WebMvcIntegrationTestBase
    {
    public AccueilTests(
    SnowfallMvcApplicationFactory application,
    TestDatabaseFixture databaseFixture) : base(application, databaseFixture)
    { }

    [Fact]
    public async Task Obtenir_AccueilUtilisateurAnonyme_PageAfficheTexte()
    {
    // Arrange
    string url = "/";

    // Act
    HttpResponseMessage reponse = await Client.GetAsync(url);

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