web-dev-qa-db-fra.com

xUnit: affirmer que deux listes <T> sont égales?

Je suis nouveau sur TDD et xUnit donc je veux tester ma méthode qui ressemble à quelque chose comme:

List<T> DeleteElements<T>(this List<T> a, List<T> b);

Existe-t-il une méthode Assert que je peux utiliser? Je pense que quelque chose comme ça serait sympa

    List<int> values = new List<int>() { 1, 2, 3 };
    List<int> expected = new List<int>() { 1 };
    List<int> actual = values.DeleteElements(new List<int>() { 2, 3 });

    Assert.Exact(expected, actual);

Y a-t-il quelque chose comme ça?

88
Petar Petrov

xUnit.Net reconnaît les collections, il vous suffit donc de faire

Assert.Equal(expected, actual); // Order is important

Vous pouvez voir d'autres assertions de collection disponibles dans CollectionAsserts.cs

Pour NUnit les méthodes de comparaison des collections de bibliothèques sont

CollectionAssert.AreEqual(IEnumerable, IEnumerable) // For sequences, order matters

et

CollectionAssert.AreEquivalent(IEnumerable, IEnumerable) // For sets, order doesn't matter

Plus de détails ici: CollectionAssert

MbUnit a également des assertions de collection similaires à NUnit: Assert.Collections.cs

105
Konstantin Spirin

Dans la version actuelle de XUnit (1.5), vous pouvez simplement utiliser

Assert.Equal (attendu, réel);

La méthode ci-dessus fera une comparaison élément par élément des deux listes. Je ne sais pas si cela fonctionne pour une version antérieure.

29
hwiechers

Avec xUnit, si vous souhaitez sélectionner les propriétés de chaque élément à tester, vous pouvez utiliser Assert.Collection.

Assert.Collection(elements, 
  elem1 => Assert.Equal(expect1, elem1.SomeProperty),
  elem2 => { 
     Assert.Equal(expect2, elem2.SomeProperty);
     Assert.True(elem2.TrueProperty);
  });

Cela teste le nombre attendu et garantit que chaque action est vérifiée.

11
Drew Williams

Récemment, j'utilisais les packages xUnit 2.4.0 Et Moq 4.10.1 Dans mon application asp.net core 2.2.

Dans mon cas, j'ai réussi à le faire fonctionner en deux étapes:

  1. Définition d'une implémentation de IEqualityComparer<T>
  2. Passez l'instance de comparateur en tant que troisième paramètre dans la méthode Assert.True:

    Assert.True(expected, actual, new MyEqualityComparer());

Mais il existe une autre façon plus agréable d'obtenir le même résultat en utilisant le package FluentAssertions . Il vous permet d'effectuer les opérations suivantes:

// Assert          
expected.Should().BeEquivalentTo(actual));

Il est intéressant de noter que Assert.Equal() échoue toujours même lorsque j'ai ordonné les éléments de deux listes pour les obtenir dans le même ordre.

1
Dmitry Stepanov