Quelle est la manière idiomatique de vérifier la taille de la collection dans xUnit?

112

J'ai dans ma suite de tests un test qui ressemble à ceci:

[Fact]
public void VerifySomeStuff()
{
    var stuffCollection = GetSomeStuff();

    Assert.Equal(1, stuffCollection.Count());
}

Ce test fonctionne comme prévu, mais lorsque je l'exécute, xUnit affiche un avertissement:

avertissement xUnit2013: n'utilisez pas Assert.Equal () pour vérifier la taille de la collection.

Cependant, aucune alternative n'est suggérée dans l'avertissement, et une recherche Google m'amène au code source dans xUnit pour le test qui vérifie que cet avertissement est imprimé.

Si ce Assert.Equal()n'est pas la bonne façon de vérifier la longueur d'une collection, qu'est-ce que c'est?


Pour clarifier: je me rends compte que je pourrais "tromper" xUnit pour ne pas émettre cet avertissement en extrayant par exemple une variable ou en utilisant à la Assert.True(stuff.Count() == 1)place. Ce dernier est juste hacky, et le premier donne l'impression que si xUnit essaie par exemple d'éviter plusieurs itérations d'un IEnumerable<T>, alors c'est la mauvaise façon de procéder (car je vais obtenir des conseils du compilateur à ce sujet séparément si c'est un problème), et xUnit lui-même ne devrait jamais avoir à évaluer l'entrée plus d'une fois (en fait, il obtiendra probablement la même entrée quelle que soit l'extraction de variable, à cause du fonctionnement de l'appel de fonction C #).

Donc, je ne suis pas seulement intéressé à supprimer cet avertissement de ma sortie. Une réponse à ma question explique également pourquoi cet avertissement est inclus dans la bibliothèque en premier lieu et pourquoi toute approche que je devrais utiliser à la place est meilleure.

Tomas Aschan
la source
si vous stockez stuffCollection.Count()dans une variable distincte et la transmettez à l'assert, cela vous donne-t-il la même erreur?
hellyale
Peut - être celui-là ?
Uwe Keim

Réponses:

112

Xunit propose des correctifs rapides pour la plupart de ses avertissements, vous devriez donc être en mesure de voir ce qu'il pense être «juste».

xunit

Dans votre cas, il veut que vous l'utilisiez Assert.Singlepuisque vous attendez exactement un article. Si vous affirmiez un nombre arbitraire, comme 412, cela ne vous avertirait pas de l'utilisation Count. Il ne suggérera de l'utiliser que Singlesi vous attendez un article ou Emptysi vous n'attendez aucun article.

vcsjones
la source
6
Merci, cela a du sens. FWIW, je voyais cela lors de la construction de VS Code, où l'action rapide n'apparaissait pas, donc inclure la suggestion de correctif dans le message d'avertissement aurait été beaucoup plus utile.
Tomas Aschan
2
@TomasLycken - ah. Oui, il y a un problème pour cela ici: github.com/xunit/xunit/issues/1423
vcsjones
5
Je ne suis pas fan de ce comportement; Parfois, le nombre de 1 n'est que fortuit, et il semble moins expressif d'appliquer l'appel à .Single (). Le test peut changer pour s'attendre à un décompte différent, et il semble ennuyeux de devoir faire le changement pour appeler une méthode complètement différente plutôt que de simplement changer un nombre.
vargonian
2
Un seul est cool pour un seul élément, j'ai 3 éléments et je ne veux pas écrire Assert.Collection complet, est-ce que xUnit a Assert.Triple? haha
Pawel Cioch
1
@PawelCioch selon xunit.net/xunit.analyzers/rules/xUnit2013.html qu'ils ont Empty, Singleet NotEmpty- si vous attendez une valeur dynamique, xUnit2013 ne devrait pas se déclencher.
mbx le
2

J'ai trouvé que cela me donne la même erreur:

Assert.Equal(2, vm.Errors.Count());

Et le lancer a empêché l'erreur d'apparaître.

Assert.Equal(2, (int)vm.Errors.Count());
devjc
la source
2
Je suis sûr que ce n'est pas la voie idéomatique .
mbx le
1

Pour un élément unique dans une liste, il est préférable d'utiliser ceci à la place: Assert.Single(resultList);

Bosco Han
la source
-1

J'ai eu le même problème lorsque j'ai utilisé la propriété Count comme ci-dessous dans xUnit.

entrez la description de l'image ici

Après, j'utilise la fonction Count () sur la collection, cela a résolu mon problème.

Bhuwan Maharjan
la source
Correction du problème, mais vous n'utilisez toujours pas XUnit comme vous le devriez!
Daniel Eisenreich
8
@DanielEisenreich quelle est la bonne façon d'affirmer le décompte d'un nombre spécifique s'il est supérieur à 1?
SomeGuyOnAComputer
@SomeGuyOnAComputer et les 4 autres votes positifs. Oubliez ce que j'ai dit, j'étais trop effronté. Si c'est plus grand, vous n'avez pas d'autre choix.
Daniel Eisenreich