Les tests sont, pour l'instant, assez difficiles à comprendre :
- 1 classe de tests avec
948 loc
- Il y a de la duplication partout
- Ce qui influe le résultat du test n'est pas mis en évidence
Prenons un exemple pour illustrer cela :
public class TirerSurUneGalinette
{
[Fact]
public void AvecUnChasseurAyantDesBallesEtAssezDeGalinettesSurLeTerrain()
{
// Début duplication 1
var id = Guid.NewGuid();
var repository = new PartieDeChasseRepositoryForTests();
repository.Add(new PartieDeChasse(id, new Terrain("Pitibon sur Sauldre") {NbGalinettes = 3},
new List<Chasseur>
{
new("Dédé") {BallesRestantes = 20},
new("Bernard") {BallesRestantes = 8},
new("Robert") {BallesRestantes = 12},
}));
var service = new PartieDeChasseService(repository, TimeProvider);
// Fin duplication 1
service.TirerSurUneGalinette(id, "Bernard");
// Début duplication 2
var savedPartieDeChasse = repository.SavedPartieDeChasse();
savedPartieDeChasse!.Id.Should().Be(id);
savedPartieDeChasse.Status.Should().Be(PartieStatus.EnCours);
savedPartieDeChasse.Terrain.Nom.Should().Be("Pitibon sur Sauldre");
savedPartieDeChasse.Terrain.NbGalinettes.Should().Be(2);
// Ce qui devrait être mis en avant 1
// Tirer sur une Galinette diminue le nombre de galinettes restantes sur le terrain
savedPartieDeChasse.Chasseurs.Should().HaveCount(3);
savedPartieDeChasse.Chasseurs[0].Nom.Should().Be("Dédé");
savedPartieDeChasse.Chasseurs[0].BallesRestantes.Should().Be(20);
savedPartieDeChasse.Chasseurs[0].NbGalinettes.Should().Be(0);
savedPartieDeChasse.Chasseurs[1].Nom.Should().Be("Bernard");
// Ce qui devrait être mis en avant 2
// 1 balle en moins et 1 galinette pour Bernard
savedPartieDeChasse.Chasseurs[1].BallesRestantes.Should().Be(7);
savedPartieDeChasse.Chasseurs[1].NbGalinettes.Should().Be(1);
savedPartieDeChasse.Chasseurs[2].Nom.Should().Be("Robert");
savedPartieDeChasse.Chasseurs[2].BallesRestantes.Should().Be(12);
savedPartieDeChasse.Chasseurs[2].NbGalinettes.Should().Be(0);
// Fin duplication 2
AssertLastEvent(savedPartieDeChasse, "Bernard tire sur une galinette");
}
...
public class Tirer
{
[Fact]
public void AvecUnChasseurAyantDesBalles()
{
// Début duplication 1
var id = Guid.NewGuid();
var repository = new PartieDeChasseRepositoryForTests();
repository.Add(new PartieDeChasse(id, new Terrain("Pitibon sur Sauldre") {NbGalinettes = 3},
new List<Chasseur>
{
new("Dédé") {BallesRestantes = 20},
new("Bernard") {BallesRestantes = 8},
new("Robert") {BallesRestantes = 12},
}));
var service = new PartieDeChasseService(repository, TimeProvider);
// Fin duplication 1
service.Tirer(id, "Bernard");
// Début duplication 2
var savedPartieDeChasse = repository.SavedPartieDeChasse();
savedPartieDeChasse!.Id.Should().Be(id);
savedPartieDeChasse.Status.Should().Be(PartieStatus.EnCours);
savedPartieDeChasse.Terrain.Nom.Should().Be("Pitibon sur Sauldre");
savedPartieDeChasse.Terrain.NbGalinettes.Should().Be(3);
savedPartieDeChasse.Chasseurs.Should().HaveCount(3);
savedPartieDeChasse.Chasseurs[0].Nom.Should().Be("Dédé");
savedPartieDeChasse.Chasseurs[0].BallesRestantes.Should().Be(20);
savedPartieDeChasse.Chasseurs[0].NbGalinettes.Should().Be(0);
savedPartieDeChasse.Chasseurs[1].Nom.Should().Be("Bernard");
// Ce qui devrait être mis en avant
// 1 balle en moins pour Bernard
savedPartieDeChasse.Chasseurs[1].BallesRestantes.Should().Be(7);
savedPartieDeChasse.Chasseurs[1].NbGalinettes.Should().Be(0);
savedPartieDeChasse.Chasseurs[2].Nom.Should().Be("Robert");
savedPartieDeChasse.Chasseurs[2].BallesRestantes.Should().Be(12);
savedPartieDeChasse.Chasseurs[2].NbGalinettes.Should().Be(0);
// Fin duplication 2
AssertLastEvent(repository.SavedPartieDeChasse()!, "Bernard tire");
}
}
Comment améliorer la situation ?
On va améliorer la situation en :
- Splittant la classe de tests
- Utilisant des
Test Data Builders
- Prenez le temps de découvrir ce
pattern
- Ressortez-en les avantages
- Prenez le temps de découvrir ce
- Améliorant les assertions
- Créer des extensions permettant de mettre en avant ce qui doit l'être
Comparez les tests avant et après cette étape, qu'en pensez-vous ?
Guide étape par étape disponible ici.