JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD007 : DrawOutsideThePinnedScope

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

[Reproducible] épingle la graine depuis un hook before/after d’xUnit. Or xUnit construit l’instance de la classe de test — et attend IAsyncLifetime.InitializeAsyncavant d’exécuter ces hooks : tout ce qui est tiré pendant la construction provient donc de la source ambiante non ensemencée.

Le résultat est pire qu’une absence de reproductibilité : le test l’annonce. L’échec affiche « Reproduce this run with [Reproducible(Seed = 1234)] », le lecteur épingle 1234, l’arrangement diffère quand même, l’échec ne revient pas, et la graine paraît cassée.

Tirez dans le corps du test, ou conservez le générateur dans le champ et matérialisez-le à chaque test.

Non conforme

[Reproducible]
public class OrderTests {
    private readonly string _reference;

    public OrderTests() {
        _reference = Any.String().StartingWith("ORD-").Generate();   // JD007 : tiré avant l'épinglage
    }

    [Fact]
    public void It_is_accepted() { /* utilise _reference */ }
}

Conforme

[Reproducible]
public class OrderTests {
    // La recette est partageable sans risque : la source aléatoire est résolue à Generate(), pas à la construction.
    private readonly IAny<string> _reference = Any.String().StartingWith("ORD-");

    [Fact]
    public void It_is_accepted() {
        string reference = _reference.Generate();   // tiré dans la portée épinglée
    }
}

Ce qui n’est pas signalé

  • Un tirage dans le corps du test, qui est bien dans la portée — vérifié par sonde contre xunit.v3 avant l’écriture de cette règle.
  • Un tirage depuis un contexte isolé Any.WithSeed(...) : ce contexte échappe par conception à la portée ambiante, le signaler serait faux.
  • Un générateur atteint par une variable locale, un champ ou un paramètre plutôt qu’écrit en ligne depuis Any. La règle ne signale qu’une chaîne dont elle peut prouver qu’elle part de la source ambiante : elle sous-signale plutôt que de se tromper.
  • Un constructeur d’IClassFixture<T>. Le type de fixture ne porte pas lui-même [Reproducible], donc la règle ne peut pas voir le lien ; le tirage y est tout aussi non épinglé, et cette page est le seul avertissement dont vous disposez.

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