Aller au contenu principal

4-5 Exécuter un scénario de test simple (Blazor)

Créer une classe de test

  1. Sous le dosser Snowfall.Tests/Web.Api/TestsE2E, créez une classe ConnexionTests.cs

    Snowfall.Tests/Web.Api/TestsE2E/ConnexionTests.cs
    public class ConnexionTests : WebApiE2ETestBase
    {
    public ConnexionTests(
    SnowfallApiKestrelApplicationFactory factory,
    TestDatabaseFixture db)
    : base(factory, db) { }

    [Fact]
    public async Task Obtenir_PageConnexion()
    {
    }
    }
  2. Testez que la page se charge et que le texte "Connexion" est présent dans la page

    public class ConnexionTests : WebApiE2ETestBase
    {
    public ConnexionTests(
    SnowfallApiKestrelApplicationFactory factory,
    TestDatabaseFixture db)
    : base(factory, db) { }

    [Fact]
    public async Task Obtenir_PageConnexion()
    {
    // Arrange

    // Act
    await Page.GotoAsync($"{BaseUrl}/connexion");

    // Assert
    Assert.Contains("Connexion", await Page.ContentAsync());
    }
    }
  3. Exécutez le test et vous recevrez malheureusement une erreur :(

    Xunit.Sdk.ContainsException
    Assert.Contains() Failure: Sub-string not found
    String: "<!DOCTYPE html><html lang="en" data-bs-th"···
    Not found: "Connexion"

    Le problème viens du fait que le test n'attend pas que l'écran de chargement de Blazor ait terminé et donc évidemment on ne retrouve pas le texte "Connexion" sur l'écran de chargement.

    Pour pallier à cela, on attendra la présente du texte dans la page.

  4. Ajoutez une instruction pour attendre la présence du texte dans la page avant le assert.

[Fact]
public async Task Obtenir_PageConnexion()
{
// Arrange

// Act
await Page.GotoAsync($"{BaseUrl}/connexion");
await Page.Locator("text=Connexion").WaitForAsync();

// Assert
Assert.Contains("Connexion", await Page.ContentAsync());
}
  1. Re-testez, ça devrait fonctionner!

Utiliser Page.Locator

Page.Locator est très pratique dans le cas des tests Blazor puisque cette fonction permet, via un sélecteur CSS, de récupérer un élément précis.

Par exemple, si on voulait valider que le texte Connexion est présent dans le titre de la page, on pourrait faire:

[Fact]
public async Task Obtenir_PageConnexion()
{
// Arrange

// Act
await Page.GotoAsync($"{BaseUrl}/connexion");
await Page.Locator("text=Connexion").WaitForAsync();

// Assert
var heading = Page.Locator("h1");
Assert.Contains("Connexion", await heading.TextContentAsync());
}