Pour créer de bons tests, il est important de toujours se concentrer sur l'écriture de bonnes assertions et encore mieux développer en utilisant T.D.D.
Lorsqu'on écrit des tests (a priori ou posteriori), il est important d'avoir en tête certains principes tels que les Test Desiderata.
[Fact]
public void EchoueAvecUnChasseurNayantPlusDeBalles()
{
...
var service = new PartieDeChasseService(repository, () => DateTime.Now);
var tirerSansBalle = () => service.TirerSurUneGalinette(id, "Bernard");
tirerSansBalle.Should().Throw<TasPlusDeBallesMonVieuxChasseALaMain>();
repository.SavedPartieDeChasse()!
.Events
.Should()
.HaveCount(1)
.And
.EndWith(new Event(new DateTime(),"Bernard veut tirer sur une galinette -> T'as plus de balles mon vieux, chasse à la main"));
}
[Fact]
public void EchoueAvecUnChasseurNayantPlusDeBalles()
{
var now = new DateTime(2024, 6, 6, 14, 50, 45);
var service = new PartieDeChasseService(repository, () => now);
var tirerSansBalle = () => service.TirerSurUneGalinette(id, "Bernard");
tirerSansBalle.Should().Throw<TasPlusDeBallesMonVieuxChasseALaMain>();
repository
.SavedPartieDeChasse()!
.Events
.Should()
.HaveCount(1)
.And
.EndWith(new Event(now,
"Bernard veut tirer sur une galinette -> T'as plus de balles mon vieux, chasse à la main"));
}
[Fact]
public void EchoueSiLaPartieDeChasseEstTerminée()
{
...
var now = new DateTime(2024, 6, 6, 14, 50, 45);
var service = new PartieDeChasseService(repository, () => now);
var tirerQuandTerminée = () => service.TirerSurUneGalinette(id, "Chasseur inconnu");
tirerQuandTerminée.Should()
.Throw<OnTirePasQuandLaPartieEstTerminée>();
repository
.SavedPartieDeChasse()!
.Events
.Should()
.HaveCount(1)
.And
.EndWith(new Event(now, "Chasseur inconnu veut tirer -> On tire pas quand la partie est terminée"));
}
public class PartieDeChasseServiceTests
{
private static readonly DateTime Now = new(2024, 6, 6, 14, 50, 45);
private static readonly Func<DateTime> TimeProvider = () => Now;
private static void AssertLastEvent(PartieDeChasse partieDeChasse,
string expectedMessage)
=> partieDeChasse.Events.Should()
.HaveCount(1)
.And
.EndWith(new Event(Now, expectedMessage));
...
[Fact]
public void EchoueAvecUnChasseurNayantPlusDeBalles()
{
...
var service = new PartieDeChasseService(repository, TimeProvider);
var tirerSansBalle = () => service.TirerSurUneGalinette(id, "Bernard");
tirerSansBalle.Should().Throw<TasPlusDeBallesMonVieuxChasseALaMain>();
AssertLastEvent(repository.SavedPartieDeChasse()!,
"Bernard veut tirer sur une galinette -> T'as plus de balles mon vieux, chasse à la main");
}
// On vérifie que le chasseur existe
if (partieDeChasse.Chasseurs.Exists(c => c.Nom == chasseur))
{
// L'utilisation de First est dès lors "safe"
var chasseurQuiTire = partieDeChasse.Chasseurs.First(c => c.Nom == chasseur);
...
}
if (partieDeChasse.Chasseurs.Exists(c => c.Nom == chasseur))
{
var chasseurQuiTire = partieDeChasse.Chasseurs.Find(c => c.Nom == chasseur)!;
...
}