JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD030: UndeclaredStringLength

PropriétéValeur
CatégorieConstraints (JustDummies.Constraints)
Sévérité🔵 Info
Activée par défautOui

Une chaîne Any.String() ne déclare aucune longueur : elle tire donc toute l’étendue par défaut — 0 à 1024 caractères, pris n’importe où dans l’ASCII.

Ce défaut est délibérément inconfortable (ADR-0076 ouvre un nouvel onglet). Un dummy assez court pour être confortable est un dummy contre lequel aucun invariant de longueur n’est jamais exercé : le test passe, et il n’a rien établi de ce que fait votre code à trois cents caractères. Mais un défaut inconfortable n’enseigne que si quelque chose nomme le remède — et un mur de caractères dans un message d’échec ne dit pas WithMaxLength. Cette règle le dit, au site d’appel, le seul endroit où vous pouvez agir.

Non conforme

string label = Any.String().Generate();
string name  = Any.String().NonEmpty().Generate();

NonEmpty() ne règle pas une longueur : elle monte le plancher à un et laisse le plafond où il était, donc le tirage couvre toujours toute l’étendue — 1 à 1025 plutôt que 0 à 1024. Le message rapporte l’intervalle que la chaîne tire réellement, pas une constante.

Les ancres le déplacent de la même façon, car un tirage ne peut pas être plus court que les littéraux qu’il doit contenir : StartingWith("hello") rapporte 5 à 1029, et NotBlank() ajoute une position de plus là où aucune ancre ne porte déjà un caractère non blanc, donc StartingWith(" ").NotBlank() rapporte 2 à 1026 tandis que StartingWith("A").NotBlank() rapporte 1 à 1025. Une ancre que le compilateur ne peut pas réduire à une constante est laissée hors de cette somme, ce qui sous-estime le plancher plutôt que de le surestimer.

Conforme

string label = Any.String().WithMaxLength(50).Generate();
string code  = Any.String().WithLength(8).Generate();
string name  = Any.String().NonEmpty().WithMaxLength(255).Generate();
string range = Any.String().WithLengthBetween(3, 20).Generate();
string set   = Any.String().OneOf("EUR", "USD", "GBP").Generate();

Déclarez la longueur que le code environnant autorise réellement — une largeur de colonne, une borne de contrat, une taille exacte. C’est le contrat que le reste de la bibliothèque applique : une contrainte exprime ce que le code exige de la valeur, jamais ce que le test affirme.

Portée

La règle raisonne sur une seule expression écrite, enracinée sur un appel de fabrique Any.String() — elle ne suit pas un générateur à travers un local, un champ ou un helper. Un appel de fabrique écrit sans longueur est signalé au moment où il est écrit, même si une instruction suivante réaffecte la variable à un générateur plus étroit :

AnyString label = Any.String();       // signalé ici : cette expression seule ne déclare aucune longueur
label = label.WithMaxLength(5);       // un nouveau générateur, plus étroit — le signalement a déjà eu lieu

Le message nomme l’intervalle que cette expression tirerait si elle était générée telle qu’écrite, pas nécessairement ce que la variable finit par contenir deux lignes plus loin. Liez la longueur dans la même expression qui démarre la chaîne pour l’éviter.

Ce qui n’est pas signalé

  • Un ensemble de valeurs. OneOf(...) fournit les valeurs : leurs longueurs sont les vôtres, aucune étendue ne s’applique.
  • Un motif. Any.StringMatching(...) porte sa forme dans le motif lui-même.
  • Tout générateur autre qu’Any.String().

Pourquoi c’est une information, pas un avertissement

Une longueur dont un test ne se soucie réellement pas est une chose qu’il est légitime de taire : une valeur passée à un logger, un champ que rien en aval ne mesure. La règle énonce un fait à peser, jamais un verdict — la même posture que JD029. Là où un site d’appel ne s’en soucie réellement pas, faites-la taire sur place avec un [SuppressMessage] qui nomme JustDummiesRule.JD030 — voir JustDummies.DiagnosticCatalog.

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