| Propriété | Valeur |
|---|---|
| Catégorie | Reproductibilité (JustDummies.Reproducibility) |
| Sévérité | 🔴 Erreur |
| Activée par défaut | Oui |
Les deux points d’entrée de graine retournent quelque chose que l’appelant doit conserver, et tous deux sont silencieux lorsque le résultat est jeté.
Any.UseSeed(seed) retourne la poignée qui ferme la portée qu’il vient d’ouvrir. L’abandonner rend la portée impossible à fermer : comme le dit la documentation de la méthode elle-même, « ne pas disposer laisse la graine épinglée pour tout ce qui s’exécute ensuite dans le même contexte d’exécution ». Chaque test ultérieur issu de ce contexte cesse silencieusement d’être arbitraire — il rejoue une séquence fixe — et les tests se couplent entre eux par l’ordre des tirages : ajouter ou réordonner un test change les valeurs de tests sans rapport.
Any.WithSeed(seed) retourne un contexte isolé et n’épingle rien du tout. Un appel dont le résultat est jeté est du code mort à un endroit qui se lit comme si la graine avait été posée : les points d’entrée ambiants Any.* continuent de tirer sans graine, exactement comme si la ligne n’existait pas.
Non conforme
Any.UseSeed(1234); // JD004 : la portée n'est jamais fermée
string reference = Any.String().Generate();
Any.WithSeed(1234); // JD004 : n'épingle rien — le tirage ci-dessous reste sans graine
int quantity = Any.Int32().Positive().Generate();
Conforme
using IDisposable scope = Any.UseSeed(1234);
string reference = Any.String().Generate();
AnyContext context = Any.WithSeed(1234);
int quantity = context.Int32().Positive().Generate();
Dans un corps de test, préférez Any.Reproducibly(() => { ... }) : il rapporte aussi la graine lorsque le corps échoue, ce qu’une portée brute ne fait pas.
Ce qui n’est pas signalé
- Une poignée tenue par une instruction
usingou une déclarationusing. - Un contexte capturé dans une variable, un champ ou un paramètre.
- Un test qui vérifie que l’appel rejette son argument —
Expect.Throws<ArgumentNullException>(() => Any.UseSeed(seed, null!)). Aucune portée n’y est ouverte, donc il n’y a rien à fuiter.