web-dev-qa-db-fra.com

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

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 me conduit au code source de xUnit pour le test qui vérifie que cet avertissement est imprimé.

Si Assert.Equal() n'est pas le bon moyen de vérifier la longueur d'une collection, quelle est?


Pour clarifier: je me rends compte que je pourrais "tromper" xUnit en n’émettant pas cet avertissement, par exemple. extraire une variable ou utiliser Assert.True(stuff.Count() == 1) à la place. Le dernier est juste hacky, et le premier se sent comme si xUnit est par exemple. en essayant d’éviter les itérations multiples d’un IEnumerable<T>, c’est alors la mauvaise façon de procéder (parce que 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 davantage l’entrée qu'une seule fois (en fait, il obtiendra probablement la même entrée, quelle que soit l'extraction de variable, en raison du fonctionnement de l'appel de fonction C #).

Donc, je ne suis pas seulement intéressé par la suppression de cet avertissement de ma sortie. Une réponse à ma question explique également pourquoi que l'avertissement est inclus dans la bibliothèque en premier lieu, et pourquoi quelle que soit l'approche que je devrais utiliser à la place est préférable.

75
Tomas Aschan

Xunit propose des solutions rapides pour la plupart de ses avertissements. Vous devriez donc pouvoir voir ce qu'il pense être "correct".

xunit

Dans votre cas, il veut que vous utilisiez Assert.Single puisque vous attendez exactement un article. Si vous déclariez un nombre arbitraire, tel que 412, cela ne vous avertirait pas de l'utilisation de Count. Il ne suggérera d'utiliser Single que si vous attendez un élément, ou Empty si vous n'attendez aucun élément.

81
vcsjones

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

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

Et le lancer a arrêté l’erreur d’apparaître.

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