4-5 Exécuter un scénario de test simple (Blazor)
Créer une classe de test
-
Sous le dosser
Snowfall.Tests/Web.Api/TestsE2E
, créez une classeConnexionTests.cs
Snowfall.Tests/Web.Api/TestsE2E/ConnexionTests.cspublic class ConnexionTests : WebApiE2ETestBase
{
public ConnexionTests(
SnowfallApiKestrelApplicationFactory factory,
TestDatabaseFixture db)
: base(factory, db) { }
[Fact]
public async Task Obtenir_PageConnexion()
{
}
} -
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());
}
} -
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.
-
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());
}
- 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());
}