For the complete documentation index, see llms.txt. This page is also available as Markdown.
5) "Approve Everything"
Il y a quelques tests pour lesquels nous avons énormément de lignes d'assertions. Nous allons les retravailler afin de les transformer en Approval Tests.
Prendre du temps pour comprendre ce qui se cache derrière cette notion d'Approval Testing
Identifier des tests sur lesquels on pourrait utiliser cette technique
Refactorer un test existant en utilisant la librairie Verify
Step 5 : "Approve Everything"
Identification des tests
On pourrait utiliser cette technique pour les tests suivants :
[UsesVerify]
public class ScenarioTests
{
[Fact]
public Task DéroulerUnePartie()
{
var time = new DateTime(2024, 4, 25, 9, 0, 0);
var repository = new PartieDeChasseRepositoryForTests();
var service = new PartieDeChasseService(repository, () => time);
var chasseurs = new List<(string, int)>
{
("Dédé", 20),
("Bernard", 8),
("Robert", 12)
};
var terrainDeChasse = ("Pitibon sur Sauldre", 4);
var id = service.Demarrer(
terrainDeChasse,
chasseurs
);
time = time.Add(TimeSpan.FromMinutes(10));
service.Tirer(id, "Dédé");
time = time.Add(TimeSpan.FromMinutes(30));
service.TirerSurUneGalinette(id, "Robert");
time = time.Add(TimeSpan.FromMinutes(20));
service.PrendreLapéro(id);
time = time.Add(TimeSpan.FromHours(1));
service.ReprendreLaPartie(id);
time = time.Add(TimeSpan.FromMinutes(2));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromMinutes(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromMinutes(1));
service.TirerSurUneGalinette(id, "Dédé");
time = time.Add(TimeSpan.FromMinutes(26));
service.TirerSurUneGalinette(id, "Robert");
time = time.Add(TimeSpan.FromMinutes(10));
service.PrendreLapéro(id);
time = time.Add(TimeSpan.FromMinutes(170));
service.ReprendreLaPartie(id);
time = time.Add(TimeSpan.FromMinutes(11));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
service.Tirer(id, "Bernard");
time = time.Add(TimeSpan.FromSeconds(1));
try
{
service.Tirer(id, "Bernard");
}
catch (TasPlusDeBallesMonVieuxChasseALaMain)
{
}
time = time.Add(TimeSpan.FromMinutes(19));
service.TirerSurUneGalinette(id, "Robert");
time = time.Add(TimeSpan.FromMinutes(30));
service.TerminerLaPartie(id);
// retourne le résultat de la méthode `Verify`
return Verify(service.ConsulterStatus(id));
}
}
# Verify
*.received.txt
public class ScenarioTests
{
private DateTime _time = new(2024, 4, 25, 9, 0, 0);
private readonly PartieDeChasseService _service;
public ScenarioTests()
{
_service = new PartieDeChasseService(
new PartieDeChasseRepositoryForTests(),
() => _time
);
}
....
}
var command = DémarrerUnePartieDeChasse()
.Avec(("Dédé", 20), ("Bernard", 8), ("Robert", 12))
.SurUnTerrainRicheEnGalinettes(4);
var id = _service.Demarrer(
command.Terrain,
command.Chasseurs
);
[Fact]
public Task DéroulerUnePartie()
{
var command = DémarrerUnePartieDeChasse()
.Avec((Data.Dédé, 20), (Data.Bernard, 8), (Data.Robert, 12))
.SurUnTerrainRicheEnGalinettes(4);
var id = _service.Demarrer(
command.Terrain,
command.Chasseurs
);
_time = _time.Add(TimeSpan.FromMinutes(10));
_service.Tirer(id, Data.Dédé);
_time = _time.Add(TimeSpan.FromMinutes(30));
_service.TirerSurUneGalinette(id, Data.Robert);
....
}
// Ajoute du temps à _time
_time = _time.Add(TimeSpan.FromMinutes(30));
// Appelle d'une méthode sur le service
_service.TirerSurUneGalinette(id, Data.Robert);
// Ajoute du temps à _time
_time = _time.Add(TimeSpan.FromMinutes(20));
// Appelle d'une méthode sur le service
_service.PrendreLapéro(id);
// Extract variable
var timeToAdd = TimeSpan.FromMinutes(10);
// Refactor l'appelle en Action
var act = () => _service.Tirer(id, Data.Dédé);
_time = _time.Add(timeToAdd);
act();