JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD009 : DrawInStaticInitializer

PropriétéValeur
CatégorieReproductibilité (JustDummies.Reproducibility)
Sévérité🟠 Avertissement
Activée par défautOui

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 depuis Any.

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.

Lire la source, ou la corriger là-bas ouvre un nouvel onglet· Repris depuis lib-v1.0.0-preview.6