| Propriété | Valeur |
|---|---|
| Catégorie | Reproductibilité (JustDummies.Reproducibility) |
| Sévérité | 🟠 Avertissement |
| Activée par défaut | Oui |
Un initialiseur de type s’exécute une fois, paresseusement, quand le premier test touche le type. Une valeur tirée là l’est donc sous le contexte ambiant que ce test-là se trouvait avoir épinglé — puis elle est partagée, inchangée, par tous les autres tests de la classe.
Trois conséquences en découlent, aucune visible :
- la valeur ne varie plus d’une exécution à l’autre : la propriété « arbitraire par défaut », celle qui révèle un test dépendant secrètement d’une valeur particulière, est désactivée ;
- les tests deviennent dépendants de l’ordre — un test peut passer parce que la valeur a été tirée sous la graine d’un voisin, et se mettre à échouer dès qu’on réordonne ou filtre la suite ;
- aucune graine rapportée ne la rejoue, le tirage appartenant au test qui s’est exécuté en premier et non à celui qui a échoué.
Stockez le générateur dans le champ statique et appelez Generate() là où la valeur est nécessaire. La source aléatoire est résolue au moment de Generate(), jamais à la construction : un générateur partagé est donc sûr et idiomatique — seule une valeur partagée ne l’est pas.
Non conforme
private static readonly string Tenant = Any.String().NonEmpty().Generate(); // JD009 : un seul tirage pour toute la suite
Conforme
private static readonly IAny<string> Tenant = Any.String().NonEmpty();
// ... dans chaque test :
string tenant = Tenant.Generate();
Ce qui n’est pas signalé
- Un champ statique portant le générateur — la forme conforme, explicitement sûre.
- Un tirage dans un initialiseur de champ d’instance ou un constructeur : c’est le sujet de JD007 quand la classe est
[Reproducible], et hors de sa portée sinon. - Un tirage depuis un contexte isolé
Any.WithSeed(...), ou un générateur atteint par une variable locale ou un champ plutôt qu’écrit en ligne depuisAny.
Une constante délibérément valable pour tout le processus — un identifiant de locataire auquel aucun test n’est couplé — est une lecture légitime de la forme non conforme. L’analyse du risque tient toujours, donc la règle la signale ; supprimez-la localement si c’est réellement ce que vous voulez.