JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD006 : DiscardedGeneratorResult

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

Un générateur est une recette immuable : chaque contrainte retourne un nouveau générateur plutôt que de muter le receveur. Ainsi numbers.NonEmpty(); se lit comme s’il contraignait numbers et ne contraint rien du tout — l’invariant déclaré est silencieusement perdu.

Ce qui justifie un diagnostic à la compilation, c’est la forme de l’échec. Le générateur continue de tirer dans le domaine large : le test passe sur la plupart des exécutions et échoue sur celle qui tire en dehors. Un Any.String() non contraint produit la chaîne vide environ une exécution sur seize — le test est vert jusqu’à ce qu’il ne le soit plus, et la valeur qui l’a cassé a disparu.

Réaffectez le résultat.

Non conforme

AnyList<int> numbers = Any.ListOf(Any.Int32());
numbers.NonEmpty();                          // JD006 : le générateur contraint est perdu

List<int> values = numbers.Generate();       // peut toujours être vide

Conforme

AnyList<int> numbers = Any.ListOf(Any.Int32()).NonEmpty();

List<int> values = numbers.Generate();

Ce qui n’est pas signalé

  • Un discard explicite_ = Any.StringMatching(pattern);. La règle existe parce que la faute est silencieuse : un appel nu se lit comme s’il mutait le receveur. Un discard ne peut pas être mal lu ainsi, et c’est la façon dont un test qui veut seulement voir la construction échouer exprime son intention. (JD002 et JD004 signalent bien _ =, car y jeter le résultat n’est jamais correct.)
  • Un test qui vérifie qu’une contrainte lève, lorsque l’appel illégal constitue tout le corps d’une lambda passée en argument — Check.ThatCode(() => Any.String().WithLength(3).StartingWith("ORD-")). L’exclusion est volontairement étroite : dans Any.Reproducibly(() => { ... }), une contrainte perdue est une instruction d’un bloc et non le corps lui-même, et elle reste signalée.
  • Une valeur générée dont le résultat est jeté — Generate() retourne la valeur, ce qui est une odeur différente et bien plus faible.

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