| Propriété | Valeur |
|---|---|
| Catégorie | Reproductibilité (JustDummies.Reproducibility) |
| Sévérité | 🔴 Erreur |
| Activée par défaut | Oui |
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.CS4014ne se déclenche pas, la lambda englobante n’étant pas elle-mêmeasync; - une méthode
async voidpassée en groupe de méthodes —Any.Reproducibly(Body). Elle se lie àActionsans le moindre avertissement, et son exception post-awaitéchappe entièrement autry/catchde 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.