JustDummies

Juste des dummies, mais redoutablement efficaces.

Sections de la documentation

JD003 : AwaitableBodyPassedToReproducibly

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

JD001 signale une lambda async passée à Any.Reproducibly. Deux formes voisines causent le même dégât sans que JD001 les voie, car il lit le marqueur async de la lambda elle-même :

  • une lambda synchrone dont le corps produit une tâche — Any.Reproducibly(() => sut.SaveAsync(x)). La lambda se lie à Action, donc la tâche est créée puis abandonnée. CS4014 ne se déclenche pas, la lambda englobante n’étant pas elle-même async ;
  • une méthode async void passée en groupe de méthodes — Any.Reproducibly(Body). Elle se lie à Action sans le moindre avertissement, et son exception post-await échappe entièrement au try/catch de la portée reproductible.

Dans les deux cas, Any.Reproducibly retourne avant l’exécution des assertions du corps, et leurs échecs n’atteignent jamais le lanceur de tests. Le test passe au vert.

Passez le corps asynchrone à Any.ReproduciblyAsync(Func<Task>) et faites await.

Non conforme

[Fact]
public void Prices_are_saved() {
    Any.Reproducibly(() => _repository.SaveAsync(price));   // JD003 : la tâche est abandonnée
}

[Fact]
public void Prices_are_saved_too() {
    Any.Reproducibly(SaveAsync);                            // JD003 : 'async void' lié à Action
}

private static async void SaveAsync() { /* ... */ }

Conforme

[Fact]
public async Task Prices_are_saved() {
    await Any.ReproduciblyAsync(() => _repository.SaveAsync(price));
}

Ce qui n’est pas signalé

  • Une lambda ou une fonction locale imbriquée dans le corps. Sa liaison et l’intention de son auteur lui appartiennent : un fire-and-forget délibéré à cet endroit ne regarde pas cet appel.
  • Une lambda async — c’est le sujet de JD001, et signaler les deux lèverait deux erreurs pour une seule faute.
  • Un corps dont tous les appels retournent void.

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