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.
- Sous le dossier
Snowfall.Tests/Web.Mvc/TestsIntegration
, créez une classeWebMvcIntegrationTestBase
. - 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();
} - Finalement, modifiez le test MVC existant (
AccueilTest
) pour qu'il hérite de la classe de base et retirez l'attribut de collectionSnowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cspublic class AccueilTests : WebMvcIntegrationTestBase
- Retirez les propriétés
_application
et_databaseFixture
en plus d'appeler le constructeur de base.Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cspublic class AccueilTests : WebMvcIntegrationTestBase
{
public AccueilTests(
SnowfallMvcApplicationFactory application,
TestDatabaseFixture databaseFixture) : base(application, databaseFixture)
{ } - Retirez les fonctions
InitializeAsync
etDisposeAsync
- Modifiez la fonction de test pour qu'elle utilise
Client
de la classe de base.Snowfall.Tests/Web.Mvc/TestsIntegration/AccueilTests.cspublic 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);
}
}