JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD008 : ArbitraryValueInTheoryData

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

xUnit évalue le fournisseur de données d’une théorie à la découverte, avant l’exécution du moindre cas de test. Une valeur tirée là l’est donc une seule fois pour toute la campagne, hors de toute portée de graine — aussi bien Any.Reproducibly que [Reproducible].

Trois défauts tiennent dans cette seule forme, et les trois sont silencieux :

  • tous les cas de la théorie reçoivent la même valeur : une théorie qui se lit comme énumérant des cas arbitraires énumère une constante ;
  • la valeur n’est rejouable depuis aucune graine rapportée, puisque aucune n’était épinglée au moment du tirage ;
  • le tirage a lieu même pour les cas filtrés, et sa position dans la séquence se décale dès qu’on ajoute ou retire un cas.

Tirez dans le corps du test, ou faites livrer le générateur par le fournisseur et matérialisez-le dans le test.

Non conforme

public static TheoryData<string> Cases => new() {
    Any.String().NonEmpty().Generate(),      // JD008 : tiré à la découverte, partagé par tous les cas
};

[Theory]
[MemberData(nameof(Cases))]
public void It_is_accepted(string reference) { /* ... */ }

Conforme

public static TheoryData<IAny<string>> Cases => new() {
    Any.String().NonEmpty(),                 // c'est la recette qui voyage, pas la valeur
};

[Theory, Reproducible]
[MemberData(nameof(Cases))]
public void It_is_accepted(IAny<string> reference) {
    string value = reference.Generate();     // tiré par cas, dans la portée épinglée
}

Ce qu’elle reconnaît comme fournisseur

Un membre nommé par un [MemberData] du même type ; un membre retournant TheoryData ou TheoryData<...> ; un membre retournant une séquence d’object[] ; et un type implémentant cette séquence, ce qui est la forme [ClassData].

Ce qui n’est pas signalé

  • Un fournisseur qui livre des générateurs plutôt que des valeurs — la forme conforme ci-dessus.
  • Un tirage dans un corps de test ordinaire, ce qui est précisément l’objectif de la règle.
  • 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.

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